Это ломается, потому что вы не обрабатываете сценарий, когда 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
или может повторно выдать исключение для своей вызывающей стороны.Компилятор также выдаст вам сообщение о том, что исключение должно быть обработано, но это произойдет только для проверенных исключений.Те, которые вы бросаете, являются непроверенными исключениями.Это означает, что в вашем случае вы можете в значительной степени игнорировать их из объявления метода.