Jの衝動書き日記

さらりーまんSEの日記でございます。

Effective Javaの読書メモ 第9章 例外

 Effective Javaの読書メモも今回でいちおう一区切り。エッセンス本だから一つにはまとめられなかった。この本はつまみ食い的に読んでいくのが一番いいかもしれない。

項目58 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する

  • チェックされる例外のポイント
    • APIの呼び出し側がエラーとなる状況を適切に回復できる場合はチェックされる例外を使用する
    • 同じパラメータを渡しても状況によって実行可能だったり不可能になったりするようなときは回復可能な状況であることが多い
    • チェックされる例外を使用しているということは、メソッド呼び出しの結果としてその関連する状況が起こる可能性があることを明確に示している
    • APIの設計者はその例外が発生した状況から回復することを要求している
  • 実行時例外のポイント
    • プログラミングエラーを示すときは実行時例外を使用する
    • 例外となる状況は事前条件違反のときがほとんど
    • API仕様が決めている契約をAPIのクライアントが単に守ってないことを例外が示す
    • RuntimeExceptionをサブクラス化すること

項目59 チェックされる例外を不必要に使用するのを避ける

  • チェックされる例外の特徴はプログラマに例外状態の処理を強制することにある
  • チェックされる例外を適用する状況は?
    • APIの適切な使用では例外状態を防ぐことができないとき
    • そのAPIを使用しているプログラマが例外に直面した時になんらかの有用な処理ができるとき
  • throws Exceptionは最悪なのでやっては駄目 絶対駄目(テストコードは除く)
  • チェックされる例外をチェックされない例外に変更する方法
    1. APIを呼び出すことで例外がスローされるかどうかチェックするメソッドを用意する
    2. 1.のメソッドの実行結果がNGとなった場合の処理をelseで書く
    3. 1.で事前チェック済なので、チェックされる例外がスローされることはなくなるためチェックされない例外に変える

項目60 標準例外を使用する

代表的なチェックされない例外

  • IllegalArgumentException:パラメータが不適切
  • IllegalStateException:メソッド呼び出しに対してオブジェクト状態が不正
  • NullPointerException:パラメータ値が禁止されているnull
  • IndexOutOfBoundsException:インデックスパラメータ値が範囲外
  • ConcurrentModificationException:禁止されているオブジェクトの並行した変更を検出
  • UnsupportedOperationException:オブジェクトがメソッドをサポートしていない

 ただし、ユーザ入力の誤り検出としてIllegalArgumentExceptionを投げるのは誤った使い方。この場合は、チェック処理は別で行い、チェック済であるはずなのに不正な値が渡された場合に投げるのが正しい(クラスの使い方をどこかで誤っているはずなので)。

参考文献

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)