我在采访中提到了以下问题:
如果在try上调用return语句或System.exit会发生什么 还是阻挡?最后会阻止执行吗?
finally块总是被执行吗?
修改 在java中尝试以上内容后:
finally
块执行但是
finally
块不会运行。
我不知道背后的原因。
答案 0 :(得分:7)
如果在try上调用return语句或System.exit会发生什么 还是阻挡?
最终会阻止执行吗?
如果是return
,是的。如果您需要血腥细节,请在JLS section 14.20.2中指定。
(请注意,在JLS术语中,return
计为突然终止。但这并不重要,因为当您仔细分析规范时,您会看到正常和突然终止都会执行finally
。)
对于System.exit()
,否。对exit
方法的调用永远不会返回,也不会抛出异常。因此,线程的“封闭”finally
子句永远不会被执行。
(在JLS的说法中,exit()
调用根本没有“终止”。它在概念上与进入无限循环的方法相同(神奇地)不使用任何CPU时间。与JVM关闭相关的活动发生在其他线程上。)
答案 1 :(得分:3)
注意:如果在执行try或catch代码时JVM退出,那么 finally块可能无法执行。同样,如果线程执行try 或者catch代码被中断或终止,finally块可能无法执行 即使整个申请仍在继续。
这句话似乎意味着:
finally
被调用,System.exit(0)
块将不会执行(,因为当调用该语句时Java VM退出)return
语句时执行(,因为在调用该语句时Java VM不会退出)。你可以用我写的一些代码来证实这一点:
public class TryExample {
public static void main(String[] args)
{
try {
int[] i = {1, 2, 3};
int x = i[3];//Change to 2 to see "return" result
return;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("caught");
System.exit(0);
} finally {
System.out.println("finally");
}
}
}
此处,在return
块中调用try
时,"最后"仍然输出到终端,但是在System.exit(0)
块中调用catch
时,它不是。
答案 2 :(得分:2)
不,它不会,当try-catch没有正常完成时,最后阻止不会被执行。
这是JLS或者它并声明:
If execution of the try block completes normally, then the finally block is executed
catch block
相同 If the catch block completes normally, then the finally block is executed.
由于您正在调用System.exit
来终止try block
内的程序,因此try-catch未正常完成,因此finally block
将不会被执行。
对于return statement
,try-catch确实正常完成,因为你没有阻塞try block
(例如无限循环,休眠线程,终止程序等)因此{{1}从方法返回后执行。