Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.exit()结果不可执行的finally块_Java_Try Catch Finally_System.exit - Fatal编程技术网

Java System.exit()结果不可执行的finally块

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时

我正在处理我的应用程序的maintanace模块下的

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我不知道终结器。