在catch块中抛出NullPointerException

D. *_*Ace 1 java nullpointerexception

我对以下问题有所了解.我有一个名为TestClass20的类,当我编译并运行时,我得到以下输出:

Exception in thread "main" MyException
        at TestClass20.m1(TestClass20.java:21)
        at TestClass20.main(TestClass20.java:17)
Run Code Online (Sandbox Code Playgroud)

//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();
   }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是为什么第11行没有抛出任何NullPointerException.第11行调用m2()方法,它抛出一个新的NullPointerException,所以我希望它抛出NullPointerException.我期待的输出应该是:

Exception in thread "main" java.lang.NullPointerException  // Exception that should have been thrown by line 11
Run Code Online (Sandbox Code Playgroud)

然后

Exception in thread "main" MyException  // Exception thrown by line 17.
Run Code Online (Sandbox Code Playgroud)

总结:第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();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后我得到以下输出:

Exception in thread "main" java.lang.NullPointerException
        at TestClass21.m2(TestClass21.java:17)
        at TestClass21.main(TestClass21.java:7)
Run Code Online (Sandbox Code Playgroud)

那么为什么NullPointerException在TestClass21.java中打印但是它没有在TestClass20.java中打印?是否无法在catch块中打印异常(NullPointerException或任何其他RuntimeException)?

任何解释将不胜感激.

谢谢

Sub*_*Sao 5

tc.m1();终于阻止了所以抛出了MyException.

最后总是被执行,所以最后一个异常是最后抛出的异常.并且NullPointerException也被抛出但是它被MyExceptionfinally块中的抑制.

tc.m1();从finally块中删除,你会看到你的NullPointerException