2010-06-21 103 views
3

當我執行下面的代碼,我看到的輸出:Java異常跟蹤

最後

異常線程 「main」 顯示java.lang.NullPointerException 在ClientTestConcepts.main(ClientTestConcepts .java:9)

誰打印出大膽的陳述。

public class ClientTestConcepts { 
    public static void main(String []args){ 
     try{ 
      throw new NullPointerException(); 
     } 
     finally{ 
      System.out.println("Finally"); 
     } 
    } 
} 

回答

7

Java運行時。

它捕獲所有未在用戶代碼中處理的異常,並將其打印在錯誤輸出中(默認情況下)。

+0

如果我發現它會發生什麼? – JavaUser 2010-06-21 13:55:55

+0

@JavaUser,無論你在'catch'塊中做什麼:-)如果你在'main'中捕獲它並且不重新拋出它,運行時將不會看到它。 – 2010-06-21 14:01:41

3

每個線程都有一個默認的未捕獲異常處理程序,當異常使其位於堆棧的頂部時運行。你正在觀察由ThreadGroup.uncaughtException提供的這一個:

由Java Virtual Machine調用時該線程組中的線程因爲一個未捕獲的異常,並且線程沒有安裝特定Thread.UncaughtExceptionHandler。

線程組的uncaughtException方法執行以下操作:(...)
...包含該線程的名稱的消息,如從線程的getName方法返回,並且在堆棧中,使用的Throwable的的printStackTrace方法,是打印到標準錯誤流。

如果你想要一些其他行爲,爲線程註冊一個未捕獲的異常處理程序。

+0

使用ThreadGroup已過時。 – Bozho 2010-06-21 13:52:50

+0

首先,它不是使用ThreadGroup的用戶。其次,這就是發生的事情。無論它是否已過時(我會說它不是,因爲它仍然是非常用的),現在是什麼導致用戶行爲。在Java運行時沒有一些魔力。 – 2010-06-21 13:57:15

+0

順便說一句,如果有人知道如何解決這個問題,我會很高興。它在預覽窗格中正確解釋,所以我認爲這是一個SO錯誤。 – 2010-06-21 13:58:40