Java における例外処理#
例外の分類#
Java はオブジェクト指向の方法で例外を処理し、異なるタイプに基づいて例外を分類します。すべての例外クラスの基底クラスは Throwable クラスで、2 つの主要なサブクラスは Error と Exception です:
Error
はプログラムが処理できないエラーで、例えば OOM などです。Exception
はプログラム自体が処理できる例外で、2 つの大きなカテゴリに分かれます:実行時例外(RuntimeException)
とチェック例外(Checked Exception)
。チェック例外は、コンパイル時に try、catch、finally キーワードを使用して処理する必要があり、そうしないとコンパイラがエラーを報告します。
finally コードブロックの実行#
例外が捕捉されるかどうかに関わらず、finally 内のコードブロックは必ず実行されます。break および continue 文が関与する場合、finally 句も実行されます。以下の特別な状況では、finally ブロックは実行されません:
- finally 文ブロック内で例外が発生した。
- 前のコードで System.exit () を使用したか、すでに return でプログラムを終了した。
- プログラムが実行されているスレッドが死亡した。
- CPU が停止した。
return と finally の実行#
参考: Java 基礎 ——finally return 実行の順序
- return 文は最初に実行されますが、すぐには戻らず、finally 文を実行します。finally 文が実行された後に return 文が結果を返します!
- finally ブロック内の return 文は try ブロック内の return を上書きします。
throw と throws の違いは?#
- throw はメソッド内部で使用され、throws はメソッド宣言に使用されます。
- throw の後には例外オブジェクトが続き、throws の後には例外タイプが続きます。
- throw の後には 1 つの例外オブジェクトしか続けられず、throws の後には複数の例外タイプを一度に宣言できます。
final、finally、finalize の違いは?#
- final:修飾子で、クラスを修飾する場合、そのクラスは継承できません;メソッドや変数を修飾する場合、そのメソッドや変数は変更できず、使用することしかできません。
- finally:try {} catch {} finally {} の最後の部分で、どんな状況でも実行されることを示します。finally 部分は省略可能ですが、存在する場合は必ず finally 内のコードが実行されます。
- finalize:Object クラスのメソッドで、ガベージコレクタが実行されるときに回収されるオブジェクトのこのメソッドが呼び出されます。
例外処理#
参考:アリババ《Java 規範マニュアル》
- Java ライブラリで定義された RuntimeException から継承された実行時例外クラス(例:
IndexOutOfBoundsException / NullPointerException
)を捕捉しないでください。この種の例外はプログラマーが事前にチェックして回避し、プログラムの堅牢性を保証します。 - 例外を捕捉するのはそれを処理するためであり、捕捉した後に何も処理せずに放棄しないでください。
- try ブロックがトランザクションコードに含まれている場合、catch で例外を捕捉した後、トランザクションをロールバックする必要がある場合は、必ず
手動でトランザクションをロールバック
することに注意してください。 - finally ブロック内で return を使用してはいけません。finally ブロック内の return が返された後、メソッドの実行は終了し、try ブロック内の return 文は再び実行されません。
- 例外タイプを正確に区別し、大きなコードブロックに対して try-catch を使用しないようにし、Exception を投げることを避けてください。