2012-08-22 118 views
2

如果某些方法從EDT線程調用未經檢查的異常,會發生什麼情況?它是否支持GUI的響應或什麼?謝謝EDT和運行時異常

+4

那麼,你試過嗎? –

+1

另請參閱[這個答案](http://stackoverflow.com/q/3020757/1076463) – Robin

+0

結果是undeterminate與所有未捕獲的拋出異常.. – kleopatra

回答

4

默認情況下,如果未捕獲到異常,堆棧跟蹤將被寫入控制檯輸出。整個圖形用戶界面並沒有變得沒有反應(但是,正如垃圾評論所述,特定組件可以保持在一種不自然的狀態),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?

注意「sun.awt.exception.handler」的把戲,在很多SO帖子中提到,不是必需的,並且在Java 7中不起作用。對於Java 7,只需使用標準的Thread.setDefaultUncaughtExceptionHandler。當然,如果您使用這兩種機制來註冊異常處理程序,代碼將在所有版本中運行。

+0

我還有一個疑問,如果不加限制拋出異常,並且EDT繼續那麼如何處理剩餘的代碼依賴於拋出未經檢查的異常的語句的返回值呢?程序是否被拆除? – MinhHoang

+1

@MinhHoang:EDT重新啓動,但是某個特定組件可能顯示爲無響應,如上面引用的[示例](http://stackoverflow.com/q/3020757/230513)中所述。 – trashgod

+0

@trashgod所以在重新啓動之前,EDT線程會關閉以前顯示的所有組件或那些組件成爲無響應組件? – MinhHoang

5

在重新啓動之前,EDT是否會關閉以前顯示的所有組件?

不,美國東部時間剛恢復執行Runnable實例,就像以前一樣;破壞Runnable s繼續拋出異常。作爲練習,請在調試器中檢查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) 
+0

您是否意味着方法actionPerformed()內的代碼被Runnable包裝等待由EDT執行? – MinhHoang

+0

不,「Runnable」調用偵聽器的'actionPerformed()'方法。在'actionPerformed()'中的任意位置斷開以查看堆棧跟蹤。我已經在上面添加了一個示例。 – trashgod