2

EDTスレッドから呼び出された特定のメソッドが未チェックの例外である場合はどうなりますか?GUIの応答性を維持しているのでしょうか。ありがとうございました

4

2 に答える 2

5

再起動する前に、EDTは以前に表示されたすべてのコンポーネントをシャットダウンしますか?

いいえ、EDTRunnableは以前と同じようにインスタンスの実行を再開します。壊れた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全体が応答しなくなることはありません(ただし、trashgodがコメントしたように、特定のコンポーネントは不自然に見える状態のままになる可能性があります)。EDTは引き続き機能します。例外がスローされたときにEDTが再起動するかどうか。

何かがうまくいかなかったかどうかを知りたいので、キャッチされていない例外ハンドラーを設定することをお勧めします。(Javaのバージョンによっては)これはEDTと他のスレッドでは機能が異なる場合があることに注意してください。

Javaで例外がグローバルにスローされたことをどのように検出できますか?

多くのSO投稿で言及されている「sun.awt.exception.handler」トリックは不要であり、Java 7では機能しないことに注意してください。Java7の場合は、標準のThread.setDefaultUncaughtExceptionHandlerを使用するだけです。もちろん、両方のメカニズムを使用して例外ハンドラーを登録すると、コードはすべてのバージョンで機能します。

于 2012-08-22T17:00:30.473 に答える