2012-04-19 43 views
1

需要你在下面的代碼反饋 -捕獲的Throwable錯誤

public static void main(String[] args) { 
try { 
     throw new OutOfMemoryError(); 
    } catch (Exception e) { 
     System.out.println("Inside catch"); 
    } catch (Throwable t){ 
     System.out.println("Inside catch throwable"); 
    }finally { 
     System.out.println("Inside finally"); 
    } 
} 

在這裏,我從try子句&引發OutOfMemoryError對象(使用new操作符)捕捉Throwable對象。所以我得到了輸出「內部可拋」&「內心終於」。但是因爲我們拋出OutofMemError不應該退出代碼(即最終不會拋出Throwable &)?在實際的實際項目中,如果我們得到OutOfMemoryError,應用程序就會退出......爲什麼這種差異?

+0

這就是爲什麼你不抓住'Throwable' – 2012-04-19 17:57:47

回答

3

一般情況下,錯誤可以被抓到過(除非他們崩潰的VM或東西),和Java 6日起允許捕獲的OutOfMemoryError。

8

enter image description here

OutOfMemoryError是一個亞類Error類,這是一個子類Throwable類的。這就是爲什麼它打印出:

內趕上拋出

2

它不管什麼異常或錯誤或子類Throwable的(這並不一定是個例外或錯誤)你可以捕獲Throwable。

什麼都不能導致線程退出異常System.exit(0);而是嘗試。

4

不,代碼不會退出,因爲您正在吞嚥異常。你描述的'傳統的Java程序'在這種錯誤上崩潰,因爲這個異常沒有被處理。您可以通過在程序的主線程上安裝默認的異常處理程序來自己測試。

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     e.printStackTrace(System.err); 
    } 
}); 

throw new OutOfMemoryError();