Java EDT和运行时异常
如果从EDT线程调用某个方法时出现未检查的异常,会发生什么情况?它会阻碍GUI的响应吗?谢谢默认情况下,如果未捕获异常,堆栈跟踪将写入控制台输出。GUI作为一个整体不会变得无响应(但是,正如垃圾神评论的那样,特定组件可能会保持不自然的外观状态),EDT继续工作: 好的做法是设置一个未捕获的异常处理程序,因为您想知道是否发生了错误。请注意(取决于Java版本),EDT的功能可能与其他线程不同: 请注意,许多SO文章中提到的“sun.awt.exception.handler”技巧是不必要的,在Java7中不起作用。对于Java 7,只需使用标准的Thread.setDefaultUncaughtExceptionHandler。当然,如果您同时使用这两种机制来注册异常处理程序,那么代码将在所有版本中工作 重新启动前,EDT是否关闭以前显示的所有组件 不,EDT只是像以前一样继续执行Java EDT和运行时异常,java,swing,Java,Swing,如果从EDT线程调用某个方法时出现未检查的异常,会发生什么情况?它会阻碍GUI的响应吗?谢谢默认情况下,如果未捕获异常,堆栈跟踪将写入控制台输出。GUI作为一个整体不会变得无响应(但是,正如垃圾神评论的那样,特定组件可能会保持不自然的外观状态),EDT继续工作: 好的做法是设置一个未捕获的异常处理程序,因为您想知道是否发生了错误。请注意(取决于Java版本),EDT的功能可能与其他线程不同: 请注意,许多SO文章中提到的“sun.awt.exception.handler”技巧是不必要的,在J
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)