2011-07-26 16 views
6

私はjavax.swingと協力して、(JAXFrontライブラリを使用して)XMLスキーマからフォームを生成するアプリケーションを作成し、ユーザーが入力したデータをXMLドキュメントに格納します。javax.swingアプリケーションの例外をキャッチ

私は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); 
         } 
        } 
    }
  • Frameクラス:ビューを生成し、まあ、問題は次のようであるイベント

    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をキャッチする方法があります。

私はあなたが私の英語を理解し、その質問に答えることができれば幸いです。

ありがとうございます。

答えて

19

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

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

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

ただし(そこからコードをコピーし、詳細についてはthisページを参照してください)プロキシを使用してスイングユーザーインターフェイススレッドをオフにスローのみ実行時例外をキャッチできます。

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()); 
+0

ありがとうございました。あなたの最初の解決策は私の問題を解決します。私はあなたに投票を与えることはできませんが、それを取る! – Charliemops

1

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

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

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

Swing/AWTスレッドでまだ処理されていないものをキャッチする場合は、default uncaught exception handlerを設定することもできます。

一般的に、回避することができる場合は、RuntimeExceptionのサブクラスをキャッチしないことをお勧めします。

setDefaultCloseOperation(EXIT_ON_CLOSE); 

をMyFrameとコンストラクタに:

0

を追加してみてください。確かに、しかし、試してみる価値がある。

+0

終了イベントを制御するために、私は 'setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);と' addWindowListener(新しいWindowAdapter(){{}};)をクリーンアップします。 – Charliemops

関連する問題