我有一个java应用程序,它是作为main方法实现的,带有try,catch finally块。这项工作是在尝试中完成的。如果我通过bash脚本启动应用程序,并在执行期间发出CTRL+C
,我注意到行为不一致。有时catch块会执行,有时则不执行。这可以解释一下吗?
(下面的示例代码 - 有时既没有记录“抓住”或“关闭完成”)
public class Foo {
public static void main(String[] args) {
try {
doStuff();
} catch (Throwable e) {
LOGGER.error("Caught.", e);
} finally {
LOGGER.info("Shutdown complete.");
}
}
}
答案 0 :(得分:2)
根据finally documentation,JVM给出的并不保证finally块的执行:
如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使整个应用程序仍在继续,finally块也可能无法执行。
因此你不能依赖finally块。 如果您需要捕获CTRL-C事件,最好使用shutdown hook。