EDTスレッドから呼び出された特定のメソッドが未チェックの例外である場合はどうなりますか?GUIの応答性を維持しているのでしょうか。ありがとうございました
2 に答える
再起動する前に、EDTは以前に表示されたすべてのコンポーネントをシャットダウンしますか?
いいえ、EDTRunnable
は以前と同じようにインスタンスの実行を再開します。壊れたRunnable
sは例外をスローし続けます。演習として、デバッガーで引用されている例を調べてください。
補遺:これは、この例の典型的なスタックトレースです。
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)
デフォルトでは、例外がキャッチされない場合、スタックトレースはコンソール出力に書き込まれます。GUI全体が応答しなくなることはありません(ただし、trashgodがコメントしたように、特定のコンポーネントは不自然に見える状態のままになる可能性があります)。EDTは引き続き機能します。例外がスローされたときにEDTが再起動するかどうか。
何かがうまくいかなかったかどうかを知りたいので、キャッチされていない例外ハンドラーを設定することをお勧めします。(Javaのバージョンによっては)これはEDTと他のスレッドでは機能が異なる場合があることに注意してください。
Javaで例外がグローバルにスローされたことをどのように検出できますか?
多くのSO投稿で言及されている「sun.awt.exception.handler」トリックは不要であり、Java 7では機能しないことに注意してください。Java7の場合は、標準のThread.setDefaultUncaughtExceptionHandlerを使用するだけです。もちろん、両方のメカニズムを使用して例外ハンドラーを登録すると、コードはすべてのバージョンで機能します。