У меня возникли проблемы с пониманием следующего. У меня есть класс с именем TestClass20, который, когда я скомпилировать и запустить я получаю следующий результат:Throwing NullPointerException в блоке catch
Exception in thread "main" MyException
at TestClass20.m1(TestClass20.java:21)
at TestClass20.main(TestClass20.java:17)
//TestClass20.java
class MyException extends IllegalArgumentException{}
public class TestClass20{
public static void main(String[] args){
TestClass20 tc = new TestClass20();
try{
tc.m1();
}
catch (MyException e){
tc.m2(); // THIS IS LINE 11
}
finally{
tc.m1(); // THIS IS LINE 17
}
}
public void m1() throws MyException{
throw new MyException(); //THIS IS LINE 21
}
public void m2() throws RuntimeException{
throw new NullPointerException();
}
}
Проблема у меня есть, почему линия 11 не бросать любые Исключение нулевого указателя. Строка 11 вызывает метод m2(), который бросает новое исключение NullPointerException, поэтому я ожидаю, что он выкинет NullPointerException. Выход я ожидал должен быть:
Exception in thread "main" java.lang.NullPointerException // Exception that should have been thrown by line 11
Тогда
Exception in thread "main" MyException // Exception thrown by line 17.
В итоге: линии 11 должен быть выброшен NullPointerException первый, а затем линия 17 бросков MyException
Если я немного изменить код к такому:
//TestClass21.java
class MyException extends IllegalArgumentException{}
public class TestClass21{
public static void main(String[] args){
TestClass21 tc = new TestClass21();
tc.m2(); //LINE 7
}
public void m1() throws MyException{
throw new MyException();
}
public void m2() throws RuntimeException{
throw new NullPointerException();
}
}
Тогда я получаю следующий результат:
Exception in thread "main" java.lang.NullPointerException
at TestClass21.m2(TestClass21.java:17)
at TestClass21.main(TestClass21.java:7)
Так почему же NullPointerException отпечатки в TestClass21.java, но не печатать в TestClass20.java? Невозможно ли распечатать исключение (исключение NullPointerException или любое другое исключение RuntimeException) в блоке catch?
Любое объяснение было бы весьма полезно.
Благодаря
У вас есть 'tc.m1(); 'в окончательном блоке, поэтому MyException выбрано. –
Почему вы ожидали чего-то другого? Выполняется блок 'finally' * всегда *. Было бы даже, если бы исключение вообще не было выброшено в диапазон 'try'. –