如果在java中执行关闭挂钩期间抛出未捕获的异常,jvm是否会立即退出而不运行其余已注册的关闭挂钩(如果有)?来自javadocs:
在关闭挂钩中处理未捕获的异常,就像在任何其他情况下一样 线程,通过调用线程的uncaughtException方法 ThreadGroup对象。打印此方法的默认实现 异常的堆栈跟踪到System.err并终止线程; 它不会导致虚拟机退出或停止。
似乎其他关机挂钩应该运行...
作为一个后续问题,拥有一段可能在关闭钩子中引发异常的代码可能不是一个好主意?如果你无法避免它,在关机钩子里尝试捕获异常是一个好习惯吗?
答案 0 :(得分:5)
由于addShutdownHook方法接受一个Thread,因此每个单独的shutdown钩子都是它自己的Thread。未捕获异常的默认行为是打印错误消息并终止线程。由于钩子具有相同的行为,因此以错误结尾的单个关闭钩子不应阻止其他钩子运行。
请注意,我实际上没有测试过这个......
答案 1 :(得分:1)
在关闭钩子中运行的代码与在主线程中运行的代码具有相同的最佳实践:如果需要,请捕获异常,如果需要则记录,或者让异常只打印到stdout。