Javaの例外は大きく3つの種類があり、それぞれに役割があります。すべての例外は、Throwable
インタフェースを実装しています。
🚜 例外の種類
出典:徹底攻略Java SE 8 Silver問題集
Error
クラスおよびそのサブクラス => 例外処理が任意のunchecked例外RuntimeException
クラスおよびそのサブクラス => 例外処理が任意のunchecked例外RuntimeException
クラス以外のException
サブクラス => 例外処理が必須のchecked例外
😸 実行時例外(RuntimeException)
プログラムを実行しているときに起こる予期しない動作を扱します。以下は代表的な例外の紹介です。
NullPointerException
: 参照先がnullで、何らかの操作を行った場合に発生ArithmeticException
: ゼロ除算など、算術計算で問題があった場合に発生ArrayIndexOutOfBoundsException
: 配列の範囲外のアクセスで発生
😀 検査例外(Exception)
何らかの理由で処理の続行が不可能になったことを示します。呼び出し元で回復処理を強制します。
IOException
: I/Oの処理に何らかの問題があったことを示すFileNotFoundException
: ファイルが見つからなかったことを示す
次のようなにメソッド宣言にthrows
文を追加するか、try-catch
で例外を処理する。
public class MyClass { |
public class MyClass { |
👽 エラー(Error)
アプリケーションでハンドリング可能な範囲を超えた、重大な問題を扱います。代表的なエラーは次のとおりです。
OutOfMemoryError
: 必要なメモリ領域を確保できない場合に発生StackOverFlowError
: スタック領域が限界を超えた場合に発生
🏀 オーバーライドにおける例外処理(throws)の注意点
メソッドをオーバーライドする際に例外処理(throws)を記述する際のルールについて。
- サブクラスのメソッドがthrowする例外は、スーパークラスのメソッドがthrowする例外クラスと同じか、その例外クラスのサブクラスとする
- サブクラスのメソッドがthrowする例外は、
RuntimeException
およびRuntimeException
のサブクラスの例外はスーパークラスのメソッドに関係なくthrowできる - スーパークラスのメソッドにthrowsがあっても、サブクラス側でthrowsを記述しないことは可能
😼 補足:finally
ブロックは必ず実行される
catch
ブロックでreturn
されてもfinally
ブロックは必ず実行されます。
try { |
🗻 補足:到達不可能なcatch
ブロックはコンパイルエラー
複数のcatch
ブロックがあって到達不可能なコードがある場合、コンパイルエラーになるので注意してください。
🐝 補足:例外の種類
例外クラス | 例外の発生条件 |
---|---|
ExceptionInInitializerError |
static初期化時に何らかのトラブルが発生した場合 |
IllegalArgumentException |
利用される側のオブジェクトが不正な引数を渡されたことを通知するため |
IllegalStateException |
利用される側のオブジェクトがまだ利用するための準備が終わっていない場合 |
NoClassDefFoundError |
JVMが実行対象のクラスファイルを発見できなかったとき |
NullPointerException |
null に対してメソッドを呼び出すようなコードの場合 |
NumberFormatException |
文字列を数字に変換しようとして、文字列の形式が正しくない場合 |
OutOfMemoryError |
ヒープメモリ(インスタンス、クラス定義を保存)がいっぱいになった場合 |