簡體   English   中英

捕獲javax.swing應用程序中的異常

[英]Catch exceptions in javax.swing application

我正在使用javax.swing來創建一個aplication,它從XML Schema生成表單(使用JAXFront庫),並將用戶填充的數據存儲到XML文檔中。

我在需要時放了try-catch-finally塊,但是當主線程結束時(AWT線程仍然在運行),我遇到了一些問題。

我有兩個主要工作的課程和其他對這個問題不重要的課程:

  • 主類 :它具有以下結構。 初始化應用程序並運行主框架

     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 } } 

嗯,問題如下:當從main方法中執行可視化函數時,生成並顯示視圖。 那一刻是我失去了對異常捕捉的控制。 然后我的問題是,是否有一些方法來捕獲此點后拋出的可能的RuntimeExceptions

我希望你能理解我的英語,並能回答這個問題。

提前致謝。

最簡單的版本是設置默認的未捕獲異常處理程序:

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

但是,這也抓住了程序其他部分拋出的未被捕獲的異常。

但是,您只能使用代理捕獲拋出事件調度線程拋出的運行時異常(有關更多信息,請參閱頁面,從那里復制代碼):

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

在調用visualize() ,唯一運行的線程是Swing / AWT事件調度線程。 如果要捕獲任何異常,則需要在此線程上調用的任何偵聽器方法中執行此操作,例如

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

為了防止樣板,您可以在超類中使用此代碼。

請注意,如果要捕獲Swing / AWT線程尚未處理的任何內容,也可以設置默認的未捕獲異常處理程序

另請注意,一般情況下,如果可以避免,則最好不要捕獲RuntimeException的子類。

嘗試添加:

setDefaultCloseOperation(EXIT_ON_CLOSE);

到MyFrame構造函數。 雖然不確定,但值得一試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM