2016-05-30 48 views
1

假設我有一個名爲BugException的類,它的範圍從RuntimeException 並且BugException有一個需要Throwable的拷貝構造函數。Java中的Throwable和Exception

此代碼編譯和typechecks:

Throwable e = ...; 
if (e instanceof BugException) { 
    throw new BugException(e); 
} 

爲什麼說:

Throwable e = ...; 
if (e instanceof BugException) { 
    throw e; 
} 

不編譯,並給出錯誤消息:未處理的異常。 java.lang.Throwable中。 ?

爲什麼這種不必要的包裝來滿足類型檢測?

+1

測試'instanceof'不會改變'e'的靜態類型。 – user2357112

+0

或者你可以簡單地施放,沒有包裝。 – pvg

回答

3

在編譯時,它不知道什麼樣的異常e是。它可能是一個checked異常,在這種情況下,編譯器將需要您將try/catch中的throw包裝或使該方法拋出它。

但是,如果您顯式強制執行未經檢查的異常,那麼它將編譯。

Throwable e = ...; 
if (e instanceof BugException) { 
    throw (BugException) e; 
} 
相關問題