6

私はjavax.swing、XMLスキーマから(JAXFrontライブラリを使用して)フォームを生成し、ユーザーが入力したデータをXMLドキュメントに格納するアプリケーションを作成するために取り組んでいます。

必要なときにtry-catch-finallyブロックを配置しましたが、メインスレッドが終了したときに例外をキャッチするのに少し問題があります(AWTスレッドはまだ実行中です)。

主な作業を行う2つのクラスと、質問にとって重要ではない他のクラスがあります。

  • メインクラス:以下の構造になっています。アプリケーションを初期化し、メインフレームを実行します

    public class Main { 
        public static void main(String[] args) {
            readArgs(); // An INI file with the app config
            Model model = initializeElements(args); // My model class
            try {
                MyFrame mfr = new MyFrame(title,model);
                mfr.visualize(); // Assembling view and setting visible
            } catch( Excepion e ) {
                doCleanUp();
                System.exit(-1);
            }
        }
    }
  • フレームクラス:ビューイベントとリッスンイベントを生成します

    public class MyFrame extends JFrame implements ActionListener,MenuListener { 
        // Some attributes
        // Other mthods without importance
        /**
         * Compose the elements, add listeners and set visible the frame
         */
        public void visualize() {
            generateFormPanel();
            setListeners();
            validate();
            setVisible(true);
        }
    
        public MyFrame(String title, Modele model) {
            super(title);
            createElementsUsing(model);
        }
    
        public void actionPerformed(ActionEvent e) {
            // Code to manage events
        }
    }

問題は次のとおりです。メインメソッドからビジュアライズ関数を実行すると、ビューが生成されて表示されます。その瞬間、私は例外をキャッチする制御を失います。次に、私の質問は、このポイントの後にスローされる可能性のあるRuntimeExceptionsをキャッチする方法があるかどうかです。

私の英語を理解して、質問に答えていただければ幸いです。

前もって感謝します。

4

3 に答える 3

24

最も単純なバージョンは、デフォルトのキャッチされていない例外ハンドラーを設定することです。

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        // do something
    }
});

しかし、それはプログラムの他の部分でスローされたキャッチされていない例外もキャッチします。

ただし、プロキシを使用して、swing イベント ディスパッチ スレッドからスローされた実行時例外のみをキャッチできます (詳細については、このページを参照してください。コードはそこからコピーされています)。

class EventQueueProxy extends EventQueue {

    protected void dispatchEvent(AWTEvent newEvent) {
        try {
            super.dispatchEvent(newEvent);
        } catch (Throwable t) {
            // do something more useful than: t.printStackTrace();
        }
    }
}

次のようにインストールします。

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy());
于 2011-07-26T09:10:34.650 に答える
1

呼び出した後visualize()、実行中の唯一のスレッドは、Swing/AWT イベント ディスパッチ スレッドです。例外をキャッチしたい場合は、このスレッドで呼び出されるリスナーメソッドのいずれかでそうする必要があります。

public void actionPerformed(ActionEvent e) {
  try {
    // Some code here
  } catch(RuntimeException e) {
    // Handling code here
  }
}

ボイラープレートを防ぐために、このコードをスーパークラスに含めることができます。

Swing/AWT スレッドによってまだ処理されていないものをキャッチしたい場合は、デフォルトのキャッチされない例外ハンドラーを設定することもできます。

一般に、回避できる場合は、RuntimeException のサブクラスをキャッチしないことがベスト プラクティスであることにも注意してください。

于 2011-07-26T09:11:07.677 に答える
0

追加してみてください:

setDefaultCloseOperation(EXIT_ON_CLOSE);

MyFrame コンストラクターに。確かではありませんが、試してみる価値があります。

于 2011-07-26T09:13:03.683 に答える