5

如果在 java 中执行关闭挂钩期间抛出未捕获的异常,jvm 是否会立即退出而不运行其余已注册的关闭挂钩(如果有)?从javadocs:

与在任何其他线程中一样,通过调用线程的 ThreadGroup 对象的 uncaughtException 方法,在关闭挂钩中处理未捕获的异常。此方法的默认实现将异常的堆栈跟踪打印到 System.err 并终止线程;它不会导致虚拟机退出或停止。

似乎其他关闭挂钩应该运行......

作为一个后续问题,拥有一段可能在关闭挂钩中引发异常的代码可能不是一个好主意?如果无法避免,尝试在关闭挂钩内捕获异常是一种好习惯吗?

4

2 回答 2

5

由于addShutdownHook方法需要一个线程,因此每个单独的关闭挂钩都是它自己的线程。未捕获异常的默认行为是打印错误消息并终止线程。由于钩子具有相同的行为,因此以错误结尾的单个关闭钩子不应阻止其他钩子运行。

请注意,我还没有实际测试过这个......

于 2012-12-07T20:42:44.733 回答
0

在关闭钩子中运行的代码与在主线程中运行的代码遵循相同的最佳实践:如果需要,捕获异常,如果需要记录,或者让异常打印到标准输出。

于 2012-12-07T20:35:22.950 回答