我有幾個自定義異常類。 (不同錯誤代碼/錯誤消息) 其中一些導致終止。這就是爲什麼我讓他們傳播到主體。 打印錯誤代碼+消息。擴展異常處理
那我要是追到超,有沒有有長的if else列表來檢查我毫無遺漏了才能到覆蓋方法,其子類的方法嗎?
難道是更具可讀性有幾個catch語句?
我應該投他們在一個較低的水平上一個例外,只有捕獲此異常?
我有幾個自定義異常類。 (不同錯誤代碼/錯誤消息) 其中一些導致終止。這就是爲什麼我讓他們傳播到主體。 打印錯誤代碼+消息。擴展異常處理
那我要是追到超,有沒有有長的if else列表來檢查我毫無遺漏了才能到覆蓋方法,其子類的方法嗎?
難道是更具可讀性有幾個catch語句?
我應該投他們在一個較低的水平上一個例外,只有捕獲此異常?
如果您需要一種特定的方式來處理SubclassOfException
,使用catch SubclassOfException
。
有在使用instanceof
檢查鏈時,這基本上就是異常處理已經這樣做沒有任何意義。
try {
} catch (SubclassOfException e) {
// Do something specific to SubclassOfException
} catch (Exception e) {
// Do something for other types.
}
是基本相同:
try {
} catch (Exception e) {
if (e instanceof SubclassOfException) {
// Do something specific to SubclassOfException.
// Note that you have to cast explicitly if you want to use
// subclass-specific properties of SubclassOfException.
} else {
// Do something for other types.
}
}
我認爲這是明顯的,首先是更具可讀性,它會得到更有效的執行,因爲這是JVM如何預計的異常處理代碼要寫。
在第一種方式書寫的另一個好處是,你可以不寫:
try {
// ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
,因爲第一個catch將捕獲所有異常由第二收集匹配,使得第二收集多餘的。因此,這是一個編譯時錯誤,在JLS Sec 11.2.3描述:
這是一個編譯時錯誤,如果catch子句可以捕獲異常E1級,並立即封閉try語句的前面的catch子句可以捕獲E1或E1的超類。
您需要先捕獲最具體的類型,然後再捕獲最不具體的類型。
在另一方面,
if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}
是不是編譯時間錯誤,即使第二分支不能執行任一;您只會看到所有SubclassOfSubclassOfException
正在處理,就好像它們僅僅是SubclassOfException
一樣。
所以我需要先訂購具有最低繼承性的catch塊,或者有沒有辦法說看看基地這個實例的級別? – gismo
@gismo我認爲當你評論這個問題時,我正在編輯的內容是? –
「沒有一個很長的if else列表來檢查哪個子類」您可以使用訪問者(可能) – 2016-08-04 11:18:19