我在练习题中有以下代码:
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的值。
到目前为止,我所阅读的关于例外情况的所有内容并没有解释这个逻辑,我自己也无法解决,所以我希望能得到一些帮助!提前谢谢。
答案 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);
}