3.包裝異常
受檢異常在理論上看起來很酷,但在實踐中卻是一個巨大的挫折。
假設你的項目中有一個超級流行的方法。它從您程序中的數百個地方調用。你決定向它添加一個新的檢查異常。很可能這個已檢查的異常真的很重要而且很特別,只有main()
方法知道如果它被捕獲時該怎麼做。
這意味著您必須將已檢查的異常添加到throws
調用您的超級流行方法的每個方法的子句中。以及在throws
調用這些方法的所有方法的子句中。以及調用這些方法的方法。
結果,throws
項目中一半方法的子句得到了一個新的檢查異常。當然,您的項目包含在測試中,現在測試無法編譯。現在您還必須在測試中編輯 throws 子句。
然後你的所有代碼(數百個文件中的所有更改)都必須由其他程序員審查。在這一點上,我們問自己為什麼要對項目進行如此多的血腥更改?一天(幾?)的工作和失敗的測試——都是為了添加一個檢查異常?
當然,仍然存在與繼承和方法重寫相關的問題。檢查異常帶來的問題比好處大得多。歸根結底,現在很少有人喜歡它們,也很少有人使用它們。
但是,仍然有很多代碼(包括標準 Java 庫代碼)包含這些已檢查的異常。他們該怎麼辦?我們不能忽視它們,我們也不知道如何處理它們。
Java 程序員建議將已檢查的異常包裝在RuntimeException
. 換句話說,捕獲所有已檢查的異常,然後創建未檢查的異常(例如,RuntimeException
)並拋出它們。這樣做看起來像這樣:
try
{
// Code where a checked exception might occur
}
catch(Exception exp)
{
throw new RuntimeException(exp);
}
這不是一個非常漂亮的解決方案,但這裡沒有任何犯罪行為:異常只是被塞進了一個RuntimeException
.
如果需要,您可以從那裡輕鬆檢索它。例子:
代碼 | 筆記 |
---|---|
|
獲取存儲在對象內部的異常 RuntimeException 。該cause 變量可能會null 確定其類型並將其轉換為已檢查的異常類型。 |