Item 58: 在可恢復(fù)的情況下使用checked exceptions,在程序錯(cuò)誤時(shí)使用runtime exceptions
Java語言提供了三種throwables:
- checked exceptions
- runtime exceptions
- errors
常常有人不知道什么時(shí)候用每一種。答案可能不那么清晰,但是有些通用的準(zhǔn)則可以作為強(qiáng)力參考。
使用checked 或者unchecked exception的最重要準(zhǔn)則是這個(gè):
當(dāng)你希望調(diào)用者能夠根據(jù)這個(gè)異常的指導(dǎo)來合理地恢復(fù),那就使用checked exceptions.
通過拋出checked exception,你強(qiáng)迫調(diào)用者去在catch語句中去處理異常,或者把它向外傳播。每個(gè)方法拋出的checked exceptions于是就變成了一個(gè)明確的指示:相關(guān)的情況是由于調(diào)用這個(gè)API造成的。
通過讓API調(diào)用者面對(duì)一個(gè)checked exception, API設(shè)計(jì)者因此可以委托/授信調(diào)用者去從那個(gè)狀態(tài)恢復(fù)。用戶也可以無視這個(gè)委托,只要catch住然后忽略掉就行了,但這常常是個(gè)壞主意。
有兩種unchecked throwables: runtime exceptions和errors.他們?cè)谛袨樯鲜穷愃频模憾际遣粦?yīng)該被也不需要被捕獲(caught)的異常。如果拋出了上面兩種異常,說明已經(jīng)產(chǎn)生了不太可能逆轉(zhuǎn)的錯(cuò)誤,繼續(xù)執(zhí)行下去可能會(huì)帶來更多的危害。如果程序沒有捕獲這樣的異常,那么線程就會(huì)停止,同時(shí)拋出合適的錯(cuò)誤信息。
使用runtime exeception來展示程序錯(cuò)誤(programming errors)。大部分的運(yùn)行時(shí)異常都表示存在提前違例。提前違例代表API調(diào)用者沒有遵循API使用明細(xì)。比如,使用數(shù)組的時(shí)候會(huì)有明細(xì)告訴你index應(yīng)該在0到數(shù)組長度減一之間,那么ArrayIndexOutOfBoundsException發(fā)生了就表明你沒有遵循,導(dǎo)致產(chǎn)生了提前違例(precondition violations)。
雖然JLS沒有明確要求,但是錯(cuò)誤常常被用來指示資源不足等等不能繼續(xù)執(zhí)行的條件。這些都是慣例了,所以最好不要再實(shí)現(xiàn)新的Error的子類了。所以,你實(shí)現(xiàn)的所有uncekced throwables都應(yīng)該直接或間接地繼承RuntimeException.
你也可以自定義一個(gè)不繼承自Exception/RuntimeException/Error的異常。但是,不要這么做。
后面講了好長的沒用的話,不譯了。