【发布时间】:2014-08-20 18:46:56
【问题描述】:
主类:
class IO
{
static void m() throws Exception
{
try
{
throw new Exception();
} finally{
System.out.println("finally");
}
}
public static void main(String [] args)
{
try {
m();
} catch (Exception ex) {
System.out.println("catch");
}
System.out.println("finish");
}
}
输出:
finally
catch
finish
我不清楚这种行为。 JLS 8 的第 11.3 条说:
如果找不到可以处理异常的 catch 子句,则 当前线程(遇到异常的线程)是 终止。在终止之前,所有 finally 子句都被执行并且 未捕获的异常按照以下规则处理:
如果当前线程设置了未捕获的异常处理程序,那么 处理程序被执行。
否则,将为当前线程的父级> ThreadGroup 调用方法uncaughtException。如果 ThreadGroup 及其父 ThreadGroups 不覆盖 uncaughtException,然后调用默认处理程序的 uncaughtException 方法。
我预计输出将是finally,只是因为当前线程已终止。我没有产生任何其他线程,因为输出必须是finally,但事实并非如此。请帮我理解。
【问题讨论】: