2016-07-09 131 views
0

Iam試圖將「catch all」代碼捕獲發生在我的代碼中的任何異常,以便將其發送到服務器。基本上,下面的代碼是我的Main的代碼。這會創建一個帶有按鈕的Jframe。當我點擊其中一個按鈕時,導致崩潰(解除引用空指針)。不過,這種例外情況並未在下面的代碼中被捕獲,而是顯示在我的CONSOL中。捕獲Main中的所有異常代碼不捕捉事件異常

public static void main(String args[]) { 

     try { 


     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 

        JFRAME_MAIN = new MainHomePage(); 
        JFRAME_MAIN.setVisible(true); 

      } 
     }); 

     } catch (Exception ex) { 

      System.out.println("Exception caught"); // <--- This is not being hit 
     } 

} 

任何想法爲什麼或如何解決這個問題?

感謝

PS:我沒有把類MainHomePage的代碼,因爲它是大的類,設置佈局,並與他們的動作偵聽器添加按鈕。在其中一位聽衆中,我發生了崩潰

回答

1

該異常未被捕獲,因爲它沒有被try-catch塊內的代碼拋出。該按鈕點擊不由此代碼處理,它由ActionListener處理。偵聽器中的代碼拋出異常。

invokeLater方法只是將一個Runnable添加到隊列中,添加Runnable的行爲是成功的,因此不會生成異常。見this page

在處理按鈕單擊的偵聽器代碼中添加try-catch,您應該能夠捕獲異常 - 請查找actionPerformed方法。

public void actionPerformed(ActionEvent e) { 
    try{ 
     // your logic here 
    } 
    catch(Exception e){ 
     // do something to handle the exception here 
    } 
} 

EDIT(迴應評論):

如果你想處理中,你可以做這樣的事情在一個地方的所有捕獲的異常:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     System.out.println("Caught exception: "+e.getClass().getName()); 
     // do something else useful here 
    } 
}); 

你會地方代碼在你的主要方法中。

+0

謝謝你的回答。但是我有很多聽衆是我的代碼,我必須添加到他們中的每一個?有沒有辦法將它添加到一個地方,以便捕獲我的應用程序拋出的任何異常? – Snake

+0

我會編輯我的答案以迴應您的評論。 –

+0

就是這樣,非常感謝你 – Snake