7

我正在努力My application's under maintanace module

try {
    if (isUndermaintanace) {
        System.exit(1);
    } else {
        prepareResources();
    }           
} catch (Exception e) {
    printStack(e);
} finally {
    cleanResources();
}

当我通过时 isundermaintanace true 终于没有执行。

我错过了什么?有没有其他方法可以做到这一点?

4

5 回答 5

15

Finally如果您杀死 VM(或者如果 VM 以其他方式死机),则不会执行。System.exit() 是一种相当粗暴的杀死程序的方法,而 finally 是一个高级 OOP 概念。System.exit() 非常快地退出,尽可能少地进行清理。

如果您进入任务管理器并终止该进程或kill -9在该进程上发出一个,您会期望最终执行吗?模糊地(非常模糊地)是同一件事。


有几点值得注意。特别是,我在帖子的第一部分撒了一点谎。System.exit()将其比作真正立即杀死程序是一种误导。特别是,关闭钩子运行,如果配置,终结器实际上可以运行。但是请注意,文档强烈建议不要使用runFinalizersOnExit.

于 2013-02-15T23:23:19.117 回答
2

System.exit立即退出程序,绕过任何其他代码执行(例如finally块)。如果要在finally块运行后退出程序,请改为抛出异常。

于 2013-02-15T23:23:51.943 回答
2

如果 JVM 在执行 try 或 catch 代码时退出,例如System.exit(),finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。

于 2013-02-15T23:24:30.910 回答
1

finally 块不会执行的唯一例外情况finally block是,如果您在 之前调用 'System.exit(1)' ,这是System.exit(1)终止 JVM 的预期行为。

于 2013-02-15T23:23:30.507 回答
1

如果您调用System.exit()您的代码将不会执行finally,因为该调用会终止您的 JVM。

于 2013-02-15T23:25:15.357 回答