3

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

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

5 回答 5

5
System.exit(0);

将卸载 JVM,即不处理进一步的 java 指令这就是不执行的原因finally{}

于 2013-01-29T08:13:34.237 回答
4

是的,这很正常。块总是被finally执行,除非 JVM 在到达代码末尾之前停止,这是您在退出 JVM 时的情况。

于 2013-01-29T08:13:47.537 回答
4

Java 6System.exit()文档中所述:

该调用System.exit(n)实际上等同于调用:Runtime.getRuntime().exit(n)

而且,如果你去看看Runtime.exit()(我的粗体字):

通过启动其关闭序列来终止当前正在运行的 Java 虚拟机。此方法永远不会正常返回。

虚拟机的关闭顺序包括两个阶段。在第一阶段,所有已注册的关闭挂钩(如果有)都以某种未指定的顺序启动,并允许同时运行直到它们完成。在第二阶段,如果 finalization-on-exit 已启用,则所有未调用的终结器都会运行。完成此操作后,虚拟机将停止。

基本上,这个函数唯一可以返回(并因此允许该finally子句运行)是它引发 aSecurityException因为任何正在运行的安全管理器都不允许使用给定的代码退出。

于 2013-01-29T08:20:07.197 回答
2

System.exit方法停止当前线程和所有其他线程的执行。finally 的存在并没有给予线程继续执行的特殊权限。

前文对此进行了非常详细的讨论。 Java 的 System.exit() 如何与 try/catch/finally 块一起工作?

于 2013-01-29T08:14:09.723 回答
0

通过System.exit(0)您正在退出 Jvm,因此在此之后不会执行任何行,这就是您发现 finally 块未执行的原因。

于 2013-01-29T08:22:27.213 回答