当前位置: 首页 > 知识库问答 >
问题:

在java中,当在关闭挂钩内引发异常时会发生什么

柏麒
2023-03-14

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

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

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

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

共有2个答案

隆礼骞
2023-03-14

在关闭钩子中运行的代码与在主线程中运行的代码遵循相同的最佳实践:如果需要,可以捕获异常,如果需要,可以记录日志,或者只将异常打印到stdout。

公西天逸
2023-03-14

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

注意,我实际上还没有测试过这个。。。

 类似资料:
  • 我最近将Oracle JDBC驱动程序版本从11.2.0.1升级到12.1.0.1。然而,我注意到一件很奇怪的事情。在我的一个测试中,我使用Java中的以下代码关闭了ResultSet对象两次: 当我使用旧的JDBC driver 11.2.0.1时,此操作没有任何异常。但是当我切换到新的JDBC驱动程序12.1.0.1时,它抛出了一个异常: 我使用JDK7u45和java.sql.ResultS

  • 问题内容: 我在程序中添加了以下代码: 但是,我没有看到该消息。附加信息:我正在Java 7的Netbeans IDE内部运行该程序。 编辑:我忘了补充说,有一个使程序保持活动状态的全局线程。我通过按Netbeans右下角的[x]来关闭它。 问题答案: JVM可以有序或突然关闭。关闭挂钩会运行以有序关闭:当最后一个线程终止时,有人呼叫或通过其他平台特定的方式(例如,按Ctrl-C)。 Shutdo

  • 根据Hibernate文档,在Hibernate抛出异常后使用会话是不安全的。 如果会话抛出异常,包括任何SQLException,立即回滚数据库事务,调用Session.close()并放弃会话实例。某些会话方法不会使会话处于一致状态。Hibernate抛出的任何异常都不能被视为可恢复的。确保通过在finally块中调用close()来关闭会话。 在我的代码中,我正在做批量插入。我正在使用会话。

  • 问题内容: 我有三个问题。 为了解释,我正在查看某人的代码,并注意到有时没有关闭。通常,Eclipse会警告您这是潜在的内存泄漏(我已修复)。但是,在Callable内部类中,没有警告。 编写代码的人都是经验丰富的Java开发人员,所以我首先想到的是它是故意的…但是可能是他们在编写代码时只是匆忙而忽略了它。 我的问题是: Eclipse为什么不突出显示这一点(可以通过以下问题的答案来回答)? 如果

  • 我注意到,在这个javadoc中,https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.htmlUncaughtExceptionHandler用于发生异常但未被捕获的情况。但是,那个线程会悄悄地失败吗?我想是的,因为它是异步进行业务的,但我正在调查我们的一个进程的相关问题,我很惊讶现

  • 我在Android Studio(3.1.3)中遇到了一个问题,当(我假设是)外部库中抛出异常时,应用程序将挂起。这使得调试变得不可能,因为我从未看到异常是什么。它不会打印到Logcat、调试控制台中,并且不会在try-catch语句中捕获异常。 起初我以为这是因为代码在另一个线程上运行,但当它也在主线程上运行时,就会发生这种情况。 我还尝试重新启动emulator、android studio和