给定的java代码不会进入finally
块,我认为这些块无论如何都应该执行:
public static void main(String[] args) {
try {
System.out.println("Hello world");
System.exit(0);
} finally {
System.out.println("Goodbye world");
}
}
给定的java代码不会进入finally
块,我认为这些块无论如何都应该执行:
public static void main(String[] args) {
try {
System.out.println("Hello world");
System.exit(0);
} finally {
System.out.println("Goodbye world");
}
}
System.exit(0);
将卸载 JVM,即不处理进一步的 java 指令这就是不执行的原因finally{}
是的,这很正常。块总是被finally
执行,除非 JVM 在到达代码末尾之前停止,这是您在退出 JVM 时的情况。
该调用
System.exit(n)
实际上等同于调用:Runtime.getRuntime().exit(n)
而且,如果你去看看Runtime.exit()
(我的粗体字):
通过启动其关闭序列来终止当前正在运行的 Java 虚拟机。此方法永远不会正常返回。
虚拟机的关闭顺序包括两个阶段。在第一阶段,所有已注册的关闭挂钩(如果有)都以某种未指定的顺序启动,并允许同时运行直到它们完成。在第二阶段,如果 finalization-on-exit 已启用,则所有未调用的终结器都会运行。完成此操作后,虚拟机将停止。
基本上,这个函数唯一可以返回(并因此允许该finally
子句运行)是它引发 aSecurityException
因为任何正在运行的安全管理器都不允许使用给定的代码退出。
该System.exit
方法停止当前线程和所有其他线程的执行。finally 的存在并没有给予线程继续执行的特殊权限。
前文对此进行了非常详细的讨论。 Java 的 System.exit() 如何与 try/catch/finally 块一起工作?
通过System.exit(0)
您正在退出 Jvm,因此在此之后不会执行任何行,这就是您发现 finally 块未执行的原因。