【问题标题】:EDT and runtime exceptionEDT 和运行时异常
【发布时间】:2012-08-22 16:50:19
【问题描述】:

如果从 EDT 线程调用的某些方法出现未经检查的异常,会发生什么?它是保持 GUI 的响应能力还是什么?谢谢你

【问题讨论】:

  • 嗯,你试过了吗?
  • 另见this answer
  • 结果是不确定的,就像所有未捕获的投掷物一样......

标签: java swing


【解决方案1】:

在重新启动之前,EDT 是否会关闭之前显示的所有组件?

不,EDT 只是像以前一样继续执行Runnable 实例;破碎的Runnables 继续抛出异常。作为练习,检查调试器中的example cited

附录:这是来自 example 的典型堆栈跟踪。

chart.DTSCTest$1.actionPerformed(DTSCTest.java:53) javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028) javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) java.awt.Component.processMouseEvent(Component.java:6373) javax.swing.JComponent.processMouseEvent(JComponent.java:3267) java.awt.Component.processEvent(Component.java:6138) java.awt.Container.processEvent(Container.java:2085) java.awt.Component.dispatchEventImpl(Component.java:4735) java.awt.Container.dispatchEventImpl(Container.java:2143) java.awt.Component.dispatchEvent(Component.java:4565) java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621) java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282) java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212) java.awt.Container.dispatchEventImpl(Container.java:2129) java.awt.Window.dispatchEventImpl(Window.java:2478) java.awt.Component.dispatchEvent(Component.java:4565) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679) java.awt.EventQueue.access$000(EventQueue.java:85) java.awt.EventQueue$1.run(EventQueue.java:638) java.awt.EventQueue$1.run(EventQueue.java:636) java.security.AccessController.doPrivileged(AccessController.java) java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) java.awt.EventQueue$2.run(EventQueue.java:652) java.awt.EventQueue$2.run(EventQueue.java:650) java.security.AccessController.doPrivileged(AccessController.java) java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) java.awt.EventQueue.dispatchEvent(EventQueue.java:649) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

【讨论】:

  • 你是说方法 actionPerformed() 中的代码被 Runnable 包装,等待 EDT 执行?
  • 不,Runnable 调用侦听器的actionPerformed() 方法。在actionPerformed() 中的任意位置中断以查看堆栈跟踪。我在上面添加了一个示例。
【解决方案2】:

默认情况下,如果未捕获到异常,则将堆栈跟踪写入控制台输出。整个 GUI 并没有变得无响应(但是,正如垃圾神评论的那样,特定组件可能会保持不自然的状态),EDT 继续工作:Does the EDT restart or not when an exception is thrown?

最好的做法是设置一个未捕获的异常处理程序,因为您想知道是否出了问题。请注意(取决于 Java 版本)EDT 的功能可能与其他线程不同:

How can I detect when an Exception's been thrown globally in Java?

请注意,许多 SO 帖子中提到的“sun.awt.exception.handler”技巧不是必需的,并且在 Java 7 中不起作用。对于 Java 7,只需使用标准的 Thread.setDefaultUncaughtExceptionHandler。当然,如果你同时使用这两种机制来注册异常处理程序,代码在所有版本中都可以工作。

【讨论】:

  • 我仍然有一个疑问,如果抛出未经检查的异常并且 EDT 继续工作,那么其他依赖于抛出未经检查异常的语句的返回值的代码会发生什么?程序被拆了吗?
  • @MinhHoang:EDT 已重新启动,但特定组件可能会出现无响应,正如上面引用的 example 中所建议的那样。
  • @trashgod 所以在重新启动之前,EDT 线程会关闭之前显示的所有组件还是这些组件变成无响应的组件?
猜你喜欢
  • 2013-12-26
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2019-05-12
  • 2017-05-27
  • 2017-08-03
相关资源
最近更新 更多