#java #exception #methods #java-8 #try-catch
#java #исключение #методы #java-8 #попробуйте-поймать
Вопрос:
class Exceptions {
public String checkExceptions(double n1, double n2, char op) throws DivideByZeroException, MultiplyByZeroException{
try {
if(op == '/' amp;amp; n2==0) {
throw new DivideByZeroException();
}
else if(op=='*' amp;amp; (n1==0 || n2==0)) {
throw new MultiplyByZeroException();
}
else {
return "No exception found";
}
}
catch (DivideByZeroException ex) {
return "Division by zero results in infinity";
}
catch(MultiplyByZeroException ex) {
return "Multiplying by zero";
}
catch(Exception ex) {
return op " not a valid operator";
}
}
public double calculate(double v1, double v2, char op) throws Exception{ //Error: This method must return a result of type double
try{
checkExceptions(v1, v2, op); //This might be wrong place to put the method. Don't know how to check if this method throws an exception or not.
if(op==' ') {
return v1 v2;
}
else if(op=='-') {
return v1-v2;
}
else{
return 0.0;
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
class DivideByZeroException extends Exception{
DivideByZeroException(){
super();
}
}
class MultiplyByZeroException extends Exception{
MultiplyByZeroException(){
super();
}
}
Основной метод принимает входные данные (2 числа и оператор (только ‘ ‘ или ‘-‘ или ‘/’ или ‘*’) и передает его методу calculate. Метод calculate должен проверять наличие исключения и, если исключения нет, возвращать вычисленное значение в основную функцию, т.е. v1 v2 или v1-v2;
В противном случае, если исключение существует, оно должно напечатать инструкцию об ошибке, а значение, возвращаемое из метода calculate в метод main, должно быть 0.0 (не напечатано).
Ответ №1:
Вы можете попробовать ниже и должны работать нормально. Вы даже можете переопределить конструктор исключений, чтобы передать сообщение об ошибке из исключения и напечатать e.GetMessage() в том месте, где перехватывается исключение. Я только что дал вам рабочий код с простой печатью сообщения.
class Exceptions {
public void checkExceptions(double n1, double n2, char op) throws DivideByZeroException, MultiplyByZeroException {
if (op == '/' amp;amp; n2 == 0) {
throw new DivideByZeroException();
} else if (op == '*' amp;amp; (n1 == 0 || n2 == 0)) {
throw new MultiplyByZeroException();
}
}
public double calculate(double v1, double v2, char op) throws Exception {
double result = 0.0;
try {
checkExceptions(v1, v2, op);
switch(op){
case ' ' : result = v1 v2;
break;
case '-' : result = v1 - v2;
break;
case '/' : result = v1 / v2;
break;
case '*' : result = v1 * v2;
break;
}
} catch (DivideByZeroException ex) {
System.out.println("Division by zero results in infinity");
} catch (MultiplyByZeroException ex) {
System.out.println("Multiplying by zero");
} catch (Exception ex) {
System.out.println(op " not a valid operator");
}
return resu<
}
}
class DivideByZeroException extends Exception {
DivideByZeroException() {
super();
}
}
class MultiplyByZeroException extends Exception {
MultiplyByZeroException() {
super();
}
}
Ответ №2:
Вы можете сделать что-то вроде
class Exceptions {
public String checkExceptions(double n1, double n2, char op) throws DivideByZeroException, MultiplyByZeroException {
if (op == '/' amp;amp; n2 == 0) {
throw new DivideByZeroException("Division by zero results in infinity");
} else if (op == '*' amp;amp; (n1 == 0 || n2 == 0)) {
throw new MultiplyByZeroException("Multiplying by zero");
} else {
return "No exception found";
}
}
public double calculate(double v1, double v2, char op) {
double result = 0;
try {
System.out.println(checkExceptions(v1, v2, op));// Print the message
if (op == ' ') {
result = v1 v2;
} else if (op == '-') {
result = v1 - v2;
} else if (op == '/') {
result = v1 / v2;
} else if (op == '*') {
result = v1 * v2;
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return resu<// Return result
}
}
class DivideByZeroException extends Exception {
DivideByZeroException(String message) {// Parametrise it
super(message);// Pass the parameter to the constructor of super class
}
}
class MultiplyByZeroException extends Exception {
MultiplyByZeroException(String message) {// Parametrise it
super(message);// Pass the parameter to the constructor of super class
}
}
public class Main {
public static void main(String[] args) {
Exceptions e = new Exceptions();
System.out.println(e.calculate(10, 0, '/'));
System.out.println(e.calculate(10, 5, '/'));
System.out.println(e.calculate(10, 5, '*'));
System.out.println(e.calculate(10, 0, '*'));
System.out.println(e.calculate(10, 5, ' '));
System.out.println(e.calculate(10, 5, '-'));
}
}
Я написал достаточно комментариев в коде, чтобы вы могли легко его понять.
Вывод:
Division by zero results in infinity
0.0
No exception found
2.0
No exception found
50.0
Multiplying by zero
0.0
No exception found
15.0
No exception found
5.0
Ответ №3:
UPD: я допустил ошибку, которую вы должны использовать
Arrays.asList(Arrays.stream(Operators.values()).map(en -> en.op)).contains(op)
вместо
Arrays.asList(Operators.values()).contains(op)
Вы можете использовать Exception(String message)
constructor для своих исключений. Также я думаю, вам следует использовать Enum для операторов indicate
class Exceptions {
public enum Operators {
PLUS(' '),
SUB('-'),
DIV('/'),
MUL('*');
public final char op;
Operators(char op) {
this.op = op;
}
}
public void checkExceptions(double n1, double n2, char op) throws Exception {
if (op == Operators.DIV.op amp;amp; n2 == 0) {
throw new DivideByZeroException("Division by zero!");
} else if (op == Operators.MUL.op amp;amp; (n1 == 0 || n2 == 0)) {
throw new MultiplyByZeroException("Multiplying by zero!");
} else if(Arrays.asList(Arrays.stream(Operators.values()).map(en -> en.op)).contains(op)) {
throw new Exception(op " not a valid operator!");
}
}
public double calculate(double v1, double v2, char op) {
try {
checkExceptions(v1, v2, op);
if (op == Operators.PLUS.op) {
return v1 v2;
} else if (op == Operators.SUB.op) {
return v1 - v2;
} else if (op == Operators.MUL.op){
return v1 * v2;
} else if(op == Operators.DIV.op) {
return v1 / v2;
} else {
return 0.0;
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
return 0.0;
}
}
class DivideByZeroException extends Exception {
DivideByZeroException(String message) {
super(message);
}
}
class MultiplyByZeroException extends Exception {
MultiplyByZeroException(String message) {
super(message);
}
}
}
Комментарии:
1. Это уникальный подход с использованием enum . Спасибо за ответ.