8

イベント ディスパッチ スレッドでスローされた例外をキャッチするコードを次に示します。

package com.ndh.swingjunk;

import java.awt.EventQueue;

import javax.swing.JFrame;

public class EntryPoint {

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
//      System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());

        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new SomeWindow("foo").setVisible(true);
            }
        });
    }
}

class SomeWindow extends JFrame {
    public SomeWindow(String title) {
        this.setTitle(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        throw new RuntimeException("hello");
    }
}

イベント ディスパッチ スレッドでスローされた例外が UncaughtExceptionHandler によって処理されないという警告を見てきましたが、私の例ではそうではないようです。登録行がコメントアウトされていても、そのまま残されていても、同じように機能しsun.awt.exception.handlerます。

4

2 に答える 2

15

EDTクラス ( java.awt.EventDispatchThread、javadoc で検索しないでください。このクラスはpackage privateです) は、AWT の起源から大幅に変更されました。

JDK6では、このクラスが EDT 内で発生する例外を適切に処理できるようになりました。現在のバージョンでは、例外処理が少し複雑です。

  • プロパティを設定した場合 sun.awt.exception.handler、EDT 内で呼び出された開発者のコ​​ードによってスローされたすべての例外に対してハンドラーが呼び出されます (以前の JDK バージョンとの互換性が保証されます)。
  • そうしないと、例外が再スローされる ため、現在の EDT が停止し UncaughtExceptionHandler、スニペットが示すように、デフォルトでそれをキャッチできます。

しかし(そしてこれは非常に重要です)、EDTのコードを注意深く見ると、モーダルダイアログが表示されているときにEDTで例外が発生すると、このメカニズムが機能しないことがわかります(これはEDTが原因だと思います管理は非常に複雑で、あえて「面倒EventQueue」とさえ言えます: 多くのコードがハックのように見えます)。

この正確な状況ではSystem.err、プロパティを設定した場合を除き、例外が に記録されsun.awt.exception.handlerます。デフォルトUncaughtExceptionHandlerがあっても役に立ちません。

したがって、これに対する私の見解は、はい、アプリケーションがモーダル ダイアログを使用していないことを確認できる場合を除いて、引き続きpropertyを気にする必要sun.awt.exception.handlerJOptionPaneがあるということです (ダイアログもモーダルであることを忘れないでください)。

于 2011-04-27T07:46:06.787 に答える
2

setDefaultUncaughtExceptionHandlerの代わりにあなたが電話しましsetUncaughtExceptionHandlerた。( aSecurityManagerが存在する場合: 前者は を必要RuntimePermission setDefaultUncaughtExceptionHandlerとし、後者はSecurityManager.checkAccess(Thread).)

于 2011-04-26T18:09:17.257 に答える