我对以下问题有所了解。 我有一个名为TestClass20的类,当我编译并运行时,我得到以下输出:
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行没有抛出任何NullPointerException。第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中打印?是不是可以在catch块中打印异常(NullPointerException或任何其他RuntimeException)?
非常感谢任何解释。
由于
答案 0 :(得分:5)
你在finally块中有tc.m1();
所以抛出了MyException。
最后总是被执行,所以最后一个异常就是最后一个抛出的异常。是的NullPointerException
也被抛出,但它被finally块中的MyException
抑制。
从finally块中删除tc.m1();
,您将看到NullPointerException
答案 1 :(得分:1)
我认为这就是你如何实现自己想要的目标。
class MyException extends IllegalArgumentException{}
public class TestClass20{
public static void main(String[] args){
TestClass20 tc = new TestClass20();
try{
tc.m2();
}
catch (NullPointerException e){
e.printStackTrace();
}
finally{
tc.m1();
}
}
public void m1() throws MyException{
throw new MyException();
}
public void m2() throws NullPointerException{
throw new NullPointerException();
}
}
答案 2 :(得分:1)
Java 7引入了一种处理这种情况的方法,您可以使用addSuppressed()
的{{1}}方法来表示您的清理(您将其置于finally块中) )没有正常完成。
Throwable
Java 7中引入的try-with-resources构造也以类似的方式工作。