主要班级:
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
,但事实并非如此。请帮助我理解。
答案 0 :(得分:2)
如果找不到可以处理异常的catch子句,[...]
但是你有一个catch
子句可以处理异常。由于抛出异常,您的m
方法将突然完成。在main
方法中The exception will be caught and handle d,然后将与主线程一起正常完成。
答案 1 :(得分:1)
通过将函数替换为代码,可能更容易看到它。
class IO
{
public static void main(String [] args)
{
try { //4 Now goes to the outer try
try //2 Checks this try for the catch, but doesn't find it
{
throw new Exception(); //1 Hits the exception
} finally{ //3 Executes this because there is no catch for this try
System.out.println("finally");
}
} catch (Exception ex) { //5 Finds the catch
System.out.println("catch");
}
//6 Continues as if nothing happened
System.out.println("finish");
}
}
答案 2 :(得分:0)
以下是流程:
class IO
{
static void m() throws Exception
{
try
{ //2
throw new Exception();
} finally{
//3
System.out.println("finally");
}
}
public static void main(String [] args)
{
try {
m();//1 method called
} catch (Exception ex) {
//4 the control returns
System.out.println("catch");
}
//5
System.out.println("finish");
}
}
只有在未处理异常时才终止该线程。