可能重复:
Is there such case when in try\finally block the finally won't be executed?
是否有任何代码,永远不会执行finally子句?
答案 0 :(得分:7)
不仅适用于System.exit,还适用于线程中断
注意:如果在执行try或catch代码时JVM退出, 那么finally块不会 执行。同样,如果线程 执行try或catch代码是 中断或杀死,终于 即使是块也不会执行 申请作为一个整体继续。
答案 1 :(得分:4)
System.exit(0)
就是一个例子。如果您编译并在“Bye”下运行将永远不会打印。
public class Main {
public static void main(String[] args) {
try {
System.out.println("Hi");
System.exit(0);
}
finally {
System.out.println("Bye!");
}
}
}
答案 2 :(得分:4)
System.exit(0)
如果不抛出安全异常。
答案 3 :(得分:4)
这是另一个例子:
try {
while (true) {
System.err.println("Its great to be alive");
}
} finally {
System.err.println("I wish!");
}
答案 4 :(得分:2)
System.exit(0);
答案 5 :(得分:1)
简而言之,如果JVM在线程位于相应的finally
块内时停止,或者如果使用某些低级机制(而不是{{1})终止线程,则不执行try
块})。
除了Thread.stop()
的明显示例之外,即使正常的JVM关闭对于守护程序线程也可能是意外的:
System.exit()
答案 6 :(得分:0)
同样在我的训练中,我找到了一个新的解决方案,这是可以接受的
try {
if (choice) {
while (true) ;
} else {
System.exit(1);
}
} finally {
code.to.cleanup();
}