在catch块中抛出NullPointerException

时间:2014-10-06 14:53:23

标签: java nullpointerexception

我对以下问题有所了解。 我有一个名为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)?

非常感谢任何解释。

由于

3 个答案:

答案 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构造也以类似的方式工作。