Effective Java - Favor the use of standard exceptions

與之前Favor the use of standard functional interfaces強調概念類似,盡量reuse現有東西。書中的範例主要都是針對unchecked exception,去說明適用情境:

  • NullPointerException: 不允許輸入參數為null時,就會使用它。可以直接使用Objects.requireNonNull去做檢查。
  • IndexOutOfBoundsException: 輸入參數超過可接受的範圍大小,就會使用它。
  • IllegalArgumentException: 輸入參數不合法,就會使用它,但請撇除上面2個情境。
  • llegalStateException: 當method在不適當的時候被呼叫,就會使用它。其實以物件命名想表達的是物件可能處於error state而無法正常工作,因而拋出llegalStateException。有的時候,這個例外我也有看過被用在絕對不可能發生的情況下去拋出llegalStateException;不過應該要盡量避免這種情境,因為單元測試可能寫不出來。StackOverflow有人對javadoc和effective java描述的使用情境認為有所不同,有興趣可以看這裡,我認為effective java描述的情境可應用的場合會比javadoc廣泛拉。
  • UnsupportedOperationException: 呼叫了不支援的method,就會使用它。我想這個例外,應該也適用於某一個method接收http method,但不支援PUT的時候,client卻傳了PUT的情境吧?
  • ConcurrentModificationException: 如果某個method偵測到multiple threads存取時,就有可能會拋這個例外。書中是說,這個是提示意味不一定準確,而我也沒拋過這個例外,因為通常會去避免發生這種情境,而不會做複雜的檢查。

最後就是這個item也有提到不要直接使用Exception、Throwable、RuntimeException或Error,我認為其實是要呼應Item 73: Throw exceptions appropriate to the abstraction

Effective Java第三版Item 72。

  • Effective Java, 3/e