代码未达到“最终”阻止

时间:2013-01-29 08:12:14

标签: java

给定的java代码不会进入finally块,我认为这些块无论如何都应该执行:

public static void main(String[] args) {
    try {
        System.out.println("Hello world");
        System.exit(0);
    } finally {
        System.out.println("Goodbye world");
    }
}

5 个答案:

答案 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块没有被执行。