The King's Museum

東京で働くソフトウェアエンジニアのブログ。

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

例外の種類

Java には次のような種類の例外があります。

  • チェックされる例外(checked exception)
  • チェックされない例外(unchecked exception)
    • 実行時例外(runtime exception)
    • エラー(error)

チェックされる例外

チェックされる例外がスローされると、プログラマは必ず次のうちのどれかの処理をする必要があります。

  • catch 節で適切に処理する
  • さらに外側のメソッドに伝播させる

この処理はコンパイラによって静的に検査されます。 これらの処理が行われていないとコンパイルエラーとなります。

チェックされる例外はメソッドの利用者にこのような処理を強制することになります。 これを強制する価値があり、これらの処理によってシステムが回復可能な場合のみ、チェックされる例外を利用するべきです。

チェックされる例外を不必要に使うと メソッドの利用者に不必要な負荷をかけてしまいます。

実行時例外

実行時例外はチェックされない例外です。 すなわちチェックされる例外で強制された「catch 節で適切に処理する」ことや「外側に伝播させる」ことが強制されません。 実行時例外がキャッチされない場合、カレントスレッドは停止します。

実行時例外はメソッドの呼び出しが「事前条件違反」の場合に利用するべきです。 たとえば、ArrayIndexOutOfBoundsException は配列のインデックスが正しくないという実行時例外です。 これは事前条件に違反している好例です。

実際、ほとんどの場合は実行時例外を利用するでしょう。 チェックされる例外を使用する機会は少ないはずです。

実行時例外を実装するためには RuntimeExcpetion を継承したクラスを作成します。

エラー

エラーはチェックされない例外の一種です。 Error クラスのサブクラスとして実装されています。

JVM が実行できないような資源不足や致命的なエラーを示すために利用されているためです。 そのため、チェックされない例外の実装としてエラーは利用するべきではありません。

その他

なお、Exception, RuntimeException、Error のサブクラスではない例外を定義することができます。 これらはチェックされる例外として扱われます。

ただし、こういうことをする必要は一切ありません。

(c) The King's Museum