为什么此异常不会导致运行时错误?
问题描述:
我有一个实践问题,下面的代码:为什么此异常不会导致运行时错误?
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的值。
一切我已阅读到目前为止有关例外并不能解释这个逻辑,我不能工作了我自己,所以我希望我能得到一些帮助!提前致谢。
答
当
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);
}
没有你尝试调试? – AdamSkywalker
异常会一直冒泡,直到它们被捕获或从执行堆栈顶部冒泡。这意味着'main()'中的'catch'会捕获并执行任何操作,因为catch块是空的。把一些输出在那里(例如'的System.out.println(“嘿,我抓到的东西”);',然后再试一次 –
@AdamSkywalker耶刚刚试了一下,它与编译和运行没有问题,它只是打印1 – Sam