为什么此异常不会导致运行时错误?

问题描述:

我有一个实践问题,下面的代码:为什么此异常不会导致运行时错误?

public class Test { 

    static String s = ""; 

    public static void m0(int a, int b) { 
     s += a; 
     m2(); 
     m1(b); 
    } 

    public static void m1(int i) { 
     s += i; 
    } 

    public static void m2() { 
     throw new NullPointerException("aa"); 
    } 

    public static void m() { 
     m0(1, 2); 
     m1(3); 
    } 

    public static void main(String args[]) { 
     try { 
      m(); 
     } catch (Exception e) { 
     } 
     System.out.println(s); 
    } 
} 

在方法2,当抛出NullPointerException异常,为何不终止线程如我所料?我认为在同一个方法中没有try catch块,它会导致异常并暂停程序。

据我了解,它已经恢复到先前调用的方法,M0,当我想抛出的异常会暂停该计划。最终的结果是程序打印1,作为s的值。

一切我已阅读到目前为止有关例外并不能解释这个逻辑,我不能工作了我自己,所以我希望我能得到一些帮助!提前致谢。

+0

没有你尝试调试? – AdamSkywalker

+5

异常会一直冒泡,直到它们被捕获或从执行堆栈顶部冒泡。这意味着'main()'中的'catch'会捕获并执行任何操作,因为catch块是空的。把一些输出在那里(例如'的System.out.println(“嘿,我抓到的东西”);',然后再试一次 –

+0

@AdamSkywalker耶刚刚试了一下,它与编译和运行没有问题,它只是打印1 – Sam

NullPointerException被抛出时,为什么它不像我想象的那样终止线程?

因为线程不会终止,除非异常遍历调用链。

我以为在同一个方法中没有try catch块,它会导致异常并暂停程序。

它不是一样的方法,它在调用链中的任何方法 - 在这种情况下,main捕获异常,防止线程终止。

您正在追赶你的主要方法例外。您的版本只是忽略它,版本下方将打印例外...

public static void main(String args[]) { 
    try { 
     m(); 
    } catch (Exception e) { 
     System.out.println("You are catching: " + e); 
    } 
    System.out.println(s); 
} 

如果你想在程序终止,不要捕获异常,如下面的例子:

public static void main(String args[]) { 
    m(); 
    // never reached 
    System.out.println(s); 
}