2011-12-05 40 views
25

在Java 7 multicatch塊如下列:在Java 7 multicatch塊中捕獲異常的類型是什麼?

try { 
    // code that throws exception 
} catch (CharacterCodingException | UnknownServiceException ex) { 
    // handle exception 
} 

是什麼ex的編譯時類型?它是兩個異常類型共同的派生類嗎?在這個例子中,這將是一個IOException

+0

它將使意義來取其拋出,但是你可以很容易地通過打印'ex.getClass檢查()' – Jon

+0

如果您需要有不同的行爲基於捕獲到的異常情況,那麼你不應該使用multicatch塊 - 將它分成多個catch塊。 –

+2

@Jon:「Type」是一個編譯時的概念,你在談論對象的運行時類。 – ColinD

回答

22

是的,ex的類型是CharacterCodingExceptionUnknownServiceException的最具體的超類型,其將是IOException

編輯:直接從馬的嘴http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch

非正式的LUB(最低上界)是問題的類型的最具體的超類型。

+0

你有什麼參考? [Oracle doc](http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html)看起來很輕。 – Andrew

+0

已更新鏈接。 – gustafc

+0

謝謝。接受的答案是。 – Andrew

12

在JSL 7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510

§14.20>將表示其類型爲一個聯合與 替代異常參數的聲明類型D1 | D2 | ... | Dn是lub(D1,D2,...,Dn)(第15.12.2.7節)。

lub()的定義即最小上限是相當複雜的。幸運的是,我們在這裏討論的類型通常只是Throwable的非泛型子類,並且lub()產生了最具體的超類。

對於更復雜的情況下,可以考慮

class E1 extends Exception implements G<A> 
class E2 extends Error implements G<B> 

lub(E1, E2) = Throwable & G<?>