Java: как проверить, генерирует ли метод исключение и завершается, когда это происходит?

#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 . Спасибо за ответ.