System.exit()结果无法执行finally块

时间:2013-02-15 23:21:49

标签: java try-catch-finally system.exit

我正在处理My application's under maintanace module

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

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

我错过了什么?还有其他办法吗?

5 个答案:

答案 0 :(得分:15)

如果你杀了VM(或者VM以其他方式死掉),

Finally不执行。 System.exit()是一种杀死程序的相当粗略的方法,而最终是一个高级OOP概念。 System.exit()非常快速地保释,尽可能少地进行清理。

如果你进入任务管理器并杀死了进程或在进程上发出了kill -9,你会期望最终执行吗?它含糊不清(非常含糊不清)同样的事情。


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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果在执行try或catch代码时JVM退出,例如System.exit(),那么finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使整个应用程序仍在继续,finally块也可能无法执行。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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