给定的java代码不会进入finally
块,我认为这些块无论如何都应该执行:
public static void main(String[] args) {
try {
System.out.println("Hello world");
System.exit(0);
} finally {
System.out.println("Goodbye world");
}
}
答案 0 :(得分:5)
System.exit(0);
将卸载JVM,即不再处理java指令
这就是没有排除finally{}
答案 1 :(得分:4)
是的,这是正常的。始终执行finally
块,除非JVM在到达代码末尾之前停止,这是您在退出JVM时的情况。
答案 2 :(得分:4)
如Java 6 System.exit()
docs中所述:
通话
System.exit(n)
实际上等同于通话:Runtime.getRuntime().exit(n)
而且,如果你去查看Runtime.exit()
(我的大胆):
通过启动其关闭序列来终止当前运行的Java虚拟机。 此方法永远不会正常返回。
虚拟机的关闭序列包含两个阶段。在第一阶段,所有已注册的关闭挂钩(如果有)都以某种未指定的顺序启动,并允许它们同时运行直到完成。在第二阶段,如果启用了退出终止,则运行所有未经调整的终结器。 完成此操作后,虚拟机将暂停。
基本上,这个函数唯一可以返回的(因此允许运行finally
子句)是为了引发SecurityException
,因为正在运行的安全管理器不允许退出给定的代码。
答案 3 :(得分:2)
System.exit
方法停止执行当前线程和所有其他线程。
最终的存在并没有给予线程特殊的权限来继续执行。
之前的内容非常详细地讨论了这一点。 How does Java's System.exit() work with try/catch/finally blocks?
答案 4 :(得分:0)
按System.exit(0)
你退出Jvm所以在此之后没有任何行将被执行,这就是为什么你发现你的finally块没有被执行。