Как обработать ошибку времени выполнения с помощью throws - PullRequest
0 голосов
/ 30 января 2019

В следующем фрагменте кода существуют случаи, когда процессы не могут обработать NullPointerException и IllegalStateException.А именно в случае, когда у меня есть входные значения val=-4 или val=-2.

Я читал, что добавление throws после подписей методов поможет.Но код все равно прерывается, если я передал упомянутые значения.

public class Test extends Throwable{
    public static void processA(int val ) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("1");
            processB(val);
        }catch(ArithmeticException e){
            System.out.println("2");
        }
        System.out.println("3");
    }
    public static void processB(int val) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("4");
            processC(val);
        }catch(NullPointerException e){
            System.out.println("5");
            processC(val+4);
        }finally{
            System.out.println("6");
        }
        System.out.println("7");
    }
    public  static void processC(int val)throws NullPointerException, IllegalStateException, ArithmeticException{
        System.out.println("8");
        if(val<1) throw new NullPointerException();
        if(val==1) throw new ArithmeticException();
        if(val>1) throw new IllegalStateException();
        System.out.println("9");
    }

    public static void main(String[] args) throws Exception {
         processA(1); //processA(-2) or processA(-4)
    }

}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я бы посоветовал вам также рассмотреть возможность использования Thread.UncaughtExceptionHandler, чтобы убедиться, что вы правильно обрабатываете исключения, которые не были должным образом перехвачены.

Отсутствие обработки исключений является очень распространенным явлением и его легко избежать, используяэтот API.

Ссылки:

0 голосов
/ 30 января 2019

Это ломается, потому что вы не обрабатываете сценарий, когда NullPointerException или IllegalStateException выбрасывается в processA(...).Вы обрабатываете только ArithmeticException .

Добавьте следующее в свой код, поэтому, если выбрасывается любое из трех исключений, оно обрабатывается методом processA.

public static void processA(int val) throws NullPointerException, IllegalStateException {
    try {
        System.out.println("1");
        processB(val);
    } catch (ArithmeticException e) {
        System.out.println("11");
    } catch (NullPointerException e) {
        System.out.println("12");
    } catch (IllegalStateException e) {
        System.out.println("13");
    }
    System.out.println("3");
}

Если вы хотите, чтобы вызывающий абонент обрабатывал их, вам нужно сделать то же самое с помощью метода caller .Например:

public static void main(String[] args) {
    try {
        processA(12);
    } catch (ArithmeticException | NullPointerException | IllegalStateException e) {
        // do something here
    } 
}

Чтобы ответить на ваш вопрос в комментариях: «Но зачем мне его использовать?»

Это будет указывать на то, что звонящий должен будетобработать исключение, выданное этим методом.Теперь вызывающая сторона может обрабатывать его с помощью блока try-catch или может повторно выдать исключение для своей вызывающей стороны.Компилятор также выдаст вам сообщение о том, что исключение должно быть обработано, но это произойдет только для проверенных исключений.Те, которые вы бросаете, являются непроверенными исключениями.Это означает, что в вашем случае вы можете в значительной степени игнорировать их из объявления метода.

...