Java EDT和运行时异常

Java EDT和运行时异常,java,swing,Java,Swing,如果从EDT线程调用某个方法时出现未检查的异常,会发生什么情况?它会阻碍GUI的响应吗?谢谢默认情况下,如果未捕获异常,堆栈跟踪将写入控制台输出。GUI作为一个整体不会变得无响应(但是,正如垃圾神评论的那样,特定组件可能会保持不自然的外观状态),EDT继续工作: 好的做法是设置一个未捕获的异常处理程序,因为您想知道是否发生了错误。请注意(取决于Java版本),EDT的功能可能与其他线程不同: 请注意,许多SO文章中提到的“sun.awt.exception.handler”技巧是不必要的,在J

如果从EDT线程调用某个方法时出现未检查的异常,会发生什么情况?它会阻碍GUI的响应吗?谢谢

默认情况下,如果未捕获异常,堆栈跟踪将写入控制台输出。GUI作为一个整体不会变得无响应(但是,正如垃圾神评论的那样,特定组件可能会保持不自然的外观状态),EDT继续工作:

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

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

重新启动前,EDT是否关闭以前显示的所有组件

不,EDT只是像以前一样继续执行
Runnable
实例;中断的
Runnable
s继续引发异常。作为练习,请在调试器中检查

附录:这是一个典型的堆栈跟踪

DTSCTest$1.actionPerformed(DTSCTest.java:53) fireActionPerformed(AbstractButton.java:2028) javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) fireActionPerformed(DefaultButtonModel.java:387) setPressed(DefaultButtonModel.java:242) javax.swing.plaf.basic.basicButtoListener.mouseReleased(basicButtoListener.java:236) java.awt.Component.ProcessMouseeEvent(Component.java:6373) javax.swing.JComponent.ProcessMouseeEvent(JComponent.java:3267) 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) dispatchEvent(Component.java:4565) awt.LightweightDispatcher.RetargetMouseeEvent(Container.java:4621) java.awt.LightweightDispatcher.ProcessMouseeEvent(Container.java:4282) awt.LightweightDispatcher.dispatchEvent(Container.java:4212) java.awt.Container.dispatchEventImpl(Container.java:2129) dispatchEventImpl(Window.java:2478) dispatchEvent(Component.java:4565) dispatchEventImpl(EventQueue.java:679) 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) AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 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) AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) dispatchEvent(EventQueue.java:649) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:211) java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:201) EventDispatchThread.pumpEvents(EventDispatchThread.java:196) EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 运行(EventDispatchThread.java:122)
好的,你试过了吗?还可以看到结果是不确定的,就像所有未经检查的可丢弃的东西一样。我仍然有一个疑问,如果抛出未检查的异常并且EDT继续工作,那么依赖于抛出未检查异常的语句返回值的其余代码会发生什么?程序被拆除了吗?@MinhHoang:EDT被重新启动,但是一个特定的组件可能看起来没有响应,正如上面引用的内容所建议的那样。@trashgod那么在重新启动之前,EDT线程是否关闭了所有以前显示的组件,或者这些组件变成了没有响应的组件?你是说ActionExecuted方法中的代码被执行了吗()由等待由EDT执行的Runnable包装?否,
Runnable
调用侦听器的
actionPerformed()
方法。在
actionPerformed()
中的任意位置断开以查看堆栈跟踪。我在上面添加了一个示例。 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)