2013-12-12 43 views
0

有什麼辦法可以避免需要在Java中的方法接口中聲明「throws」?重新編寫異常,但不添加拋出聲明

問題是:我有一個非常簡單的方法,它會拋出NPE。這很簡單,我添加了所有可能的檢查,坦白地說我無法想象這會發生什麼,所以我想調查。我添加了try/catch(Throwable e)和logging,並最終要重新拋出。

這需要我添加「拋出」聲明。但是這個方法是接口的實現,所以我需要更新接口,然後是所有其他實現,然後是一些(可能很多)的用法。真的沒有辦法避免這種情況嗎?我現在要做的是在catch的結尾導致本地異常:通過訪問null或通過除以0 - 這看起來很糟糕!

+0

不要捕獲'Throwable',因爲它包含像'VirtualMachineError','OutOfMemoryError'和'ThreadDeath'這樣的東西,你不想捕獲或試圖從中恢復。只要抓住'Exception'或者更好的辦法就是'RuntimeException'。 –

+0

@DavidConrad,你是對的。如果我抓到特定的NPE,我不會有這個問題。 – Kurtevich

回答

2

如果您不關心原始異常被保留,您可以拋出RuntimeException並將原始異常包裹在其中。 RuntimeException和派生異常未經檢查,不需要列出。如果您需要保留原始異常,則必須調整throws子句。

+1

此外,如果您只關注NPE,因爲它是RuntimeException,您可以捕獲NullPointerException,然後重新拋出它。這不需要改變方法簽名。 –

+0

很酷,這個工程!相對於我來說,奇怪的行爲是,編譯器「知道」某些「特殊」的繼承分支,應該區別對待......我的意思是這就是我沒有想到的原因。謝謝。 – Kurtevich

+0

編譯器知道'RuntimeException'和任何從它下降的東西不需要在方法的'throws'子句中聲明。這些在Java中稱爲「未經檢查的例外」。 –