2

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

4

2 回答 2

5

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

Runnable不,EDT 只是像以前一样恢复执行实例;broken Runnables 继续抛出异常。作为练习,检查调试器中引用的示例。

附录:这是此示例中的典型堆栈跟踪。

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)
于 2012-08-22T19:22:16.307 回答
4

默认情况下,如果没有捕获到异常,堆栈跟踪将写入控制台输出。整个 GUI 并没有变得无响应(但是,正如垃圾神评论的那样,特定组件可以保持在看起来不自然的状态),EDT 继续工作:当抛出异常时 EDT 是否重新启动?

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

如何检测何时在 Java 中全局抛出异常?

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

于 2012-08-22T17:00:30.473 回答