Ste*_*fan 5 java exception throws
“处理或申报。这是法律。” -先行
但是,这是一条好法律吗?我先举个例子:
public static void main(String[] args) throws Exception {
m1();
}
static void m1() throws Exception{
m2();
}
static void m2() throws Exception {
throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
m2() 抛出异常并m1()调用m2(),这意味着它必须处理或声明它。嗯,让我们宣布吧。然后main()调用m1(),它有相同的 poll: declare或handle。我再次决定声明它并且代码编译得很好。
好的,它有效,但是谁处理了这个异常呢?好像没有人做过。我知道我是初学者,但我不喜欢那样的声音。是的,有些方法可以决定是声明还是处理异常,但为什么main()呢?main 方法不应该是一个只处理的方法吗?那样的话,任何例外都不会“滑倒”。
我错过了什么吗?老实说,我很惊讶 main 方法可以只声明异常,因为知道这是我们在技术上可以捕获某些东西的最后一个地方。
谁处理了这个异常?
Java 运行时做到了。
更具体地说,UncaughtExceptionHandler正如 Java 语言规范 (JLS) 第11.3节中所指定的那样。异常的运行时处理:
如果找不到
catch可以处理异常的子句,则终止当前线程(遇到异常的线程)。在终止之前,所有finally子句都被执行,未捕获的异常按照以下规则处理:
如果当前线程设置了未捕获的异常处理程序,则执行该处理程序。
否则,
uncaughtException为ThreadGroup当前线程的父线程调用该方法。如果ThreadGroup及其父ThreadGroups 没有覆盖uncaughtException,则uncaughtException调用默认处理程序的方法。
因此,默认情况下,当main()抛出异常(未检查或已检查)时,内置的默认“未捕获异常处理程序”将简单地将堆栈System.err跟踪打印到,就像在main()调用之前执行以下操作一样:
Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler());
Run Code Online (Sandbox Code Playgroud)
class DefaultUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
在“未捕获的异常处理程序”被调用后,线程被终止,就像你简单地从main()方法返回一样,除非代码已经启动了仍在运行的非守护线程,否则程序结束。