Java System.exit()结果不可执行的finally块
我正在处理我的应用程序的maintanace模块下的Java System.exit()结果不可执行的finally块,java,try-catch-finally,system.exit,Java,Try Catch Finally,System.exit,我正在处理我的应用程序的maintanace模块下的 try { if (isUndermaintanace) { System.exit(1); } else { prepareResources(); } } catch (Exception e) { printStack(e); } finally { cleanResources(); } 当我通过isundermaintanacetrue时
try {
if (isUndermaintanace) {
System.exit(1);
} else {
prepareResources();
}
} catch (Exception e) {
printStack(e);
} finally {
cleanResources();
}
当我通过isundermaintanace
true
时,最终没有执行
我错过了什么?还有其他方法吗?最后,如果您杀死虚拟机(或者虚拟机以其他方式死亡),则不会执行
。exit()是一种相当粗糙的终止程序的方法,而finally是一种高级OOP概念。System.exit()非常快地停止,尽可能少地进行清理
如果您进入任务管理器并终止了流程,或者对流程发出了kill-9
,您是否希望最终执行?这是模糊(非常模糊)的同一件事
有几件事值得注意。特别是,我在文章的第一部分撒了一点谎。将System.exit()
比作真正的立即终止程序是一种误导。特别是,可以运行关闭挂钩,并且可以实际运行终结器。但是,请注意,文档强烈建议不要使用runFinalizersOnExit
唯一的例外情况是,如果在最终块之前调用“System.exit(1)”,则最终块不会执行,这是作为系统.exit(1)的预期行为
将终止JVM。系统。exit
立即退出程序,绕过任何其他代码执行(例如最终
块)。如果您想在运行finally
块后退出程序,请抛出异常。如果JVM在执行try或catch代码时退出,例如System.exit()
,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,即使整个应用程序继续运行,finally块也可能不会执行。如果调用System.exit()
则代码不会执行finally
,因为该调用会终止JVM 可能你唯一能做的就是更改系统。退出(1)
以其他方式关闭你的应用程序。仅第一句话+1。这是一个多么优雅的表达方式。但是,还有其他方法吗?
?@user000001只是编辑我的答案来解决这个问题。请注意,需要在System.exit()之后运行终结器是设计失败的一个相当严重的迹象。@Corbin+1我不知道终结器。