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

时间:2016-07-04 14:02:30

标签: java exception-handling

我在练习题中有以下代码:

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);
    }
}

在方法m2中,当抛出NullPointerException时,为什么它不像我预期的那样终止线程?我认为因为在同一个方法中没有try catch块,它会导致异常并停止程序。

据我了解,当我认为抛出的异常会暂停程序时,它已恢复到之前调用的方法m0。最终结果是程序打印1,作为s的值。

到目前为止,我所阅读的关于例外情况的所有内容并没有解释这个逻辑,我自己也无法解决,所以我希望能得到一些帮助!提前谢谢。

2 个答案:

答案 0 :(得分:3)

  

当抛出NullPointerException时,为什么它不像我预期的那样终止线程?

因为线程不会终止,除非异常一直向上移动到调用链。

  

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

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

答案 1 :(得分:2)

您正在主方法中捕获异常。您的版本只是忽略它,下面的版本会打印异常......

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);
}