【问题标题】:What happens when an exception is thrown inside a shutdown hook in java在 java 的关闭钩子中抛出异常时会发生什么
【发布时间】:2012-11-26 01:37:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java exception-handling jvm shutdown-hook


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我已经测试过这种行为,你是对的,特定关闭挂钩中的异常不会阻止其他挂钩运行。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2010-12-12
      • 2017-02-10
      • 2013-05-11
      • 2017-12-03
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多