【发布时间】:2014-11-06 06:45:31
【问题描述】:
我在一次采访中被问到 finally 块什么时候不执行。我回答说,当 JVM 在调用 finally 之前突然关闭或调用 System.exit() 时。然后有人问我如何避免这种情况,以便我们的程序始终保持执行。就是这种情况应该处理。我们能处理这样的情况吗?如果是怎么办? 提前致谢。
【问题讨论】:
标签: java jakarta-ee
我在一次采访中被问到 finally 块什么时候不执行。我回答说,当 JVM 在调用 finally 之前突然关闭或调用 System.exit() 时。然后有人问我如何避免这种情况,以便我们的程序始终保持执行。就是这种情况应该处理。我们能处理这样的情况吗?如果是怎么办? 提前致谢。
【问题讨论】:
标签: java jakarta-ee
即使 finally 失败但仍会执行 shutdownhook。
答案是-
Runtime#addShutdownHook
Java 虚拟机响应两种情况而关闭 事件:
- 程序正常退出,当最后一个非守护线程退出或调用 exit(等效于 System.exit)方法时,或
- 虚拟机被终止以响应用户中断,例如键入 ^C,或系统范围的事件,例如用户注销或
系统关闭。
代码-
Runtime.addShutdownHook(new Thread {
public void run() {
System.out.println("Just before going down..");
});
【讨论】:
如果你用一把足够大的枪杀死你的系统,它最终将不再对你好。您必须拥有一个冗余系统才能让您的代码继续运行。
【讨论】:
oracle 网站上的 Java 教程说。
finally 块总是在 try 块退出时执行。这 确保即使出现意外情况也会执行 finally 块 发生异常。
注意:如果在执行 try 或 catch 代码时 JVM 退出, 那么finally块可能不会执行。同样,如果线程 执行 try 或 catch 代码被中断或杀死,finally 即使应用程序作为一个整体,块也可能不会执行 继续。
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
【讨论】: