我正在处理My application's under maintanace module
try {
if (isUndermaintanace) {
System.exit(1);
} else {
prepareResources();
}
} catch (Exception e) {
printStack(e);
} finally {
cleanResources();
}
当我通过isundermaintanace
true
时最终没有执行。
我错过了什么?还有其他办法吗?
答案 0 :(得分:15)
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。