Javaの例外処理(Exception)について


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 void hogehoge() throws IOException {
// IO をつかった処理で
throw new IOException(something went wrong!); // 例外インスタンスをthrow
}
}
public class MyClass {
public void hogehoge() {
try {
// 検査例外を投げるメソッド呼び出しを含む何らかの処理
} catch (IOException e) {
// IOException に対する例外処理
}
}
}

🏀 エラー(Error)

アプリケーションでハンドリング可能な範囲を超えた、重大な問題を扱います。代表的なエラーは次のとおりです。

  • OutOfMemoryError : 必要なメモリ領域を確保できない場合に発生
  • StackOverFlowError : スタック領域が限界を超えた場合に発生

🐞 オーバーライドにおける例外処理(throws)の注意点

メソッドをオーバーライドする際に例外処理(throws)を記述する際のルールについて。

  • サブクラスのメソッドがthrowする例外は、スーパークラスのメソッドがthrowする例外クラスと同じか、その例外クラスのサブクラスとする
  • サブクラスのメソッドがthrowする例外は、RuntimeExceptionおよびRuntimeExceptionのサブクラスの例外はスーパークラスのメソッドに関係なくthrowできる
  • スーパークラスのメソッドにthrowsがあっても、サブクラス側でthrowsを記述しないことは可能

🗽 補足:finallyブロックは必ず実行される

catchブロックでreturnされてもfinallyブロックは必ず実行されます。

try {
throw new RuntimeException();
} catch (RuntimeException e) {
return 10;
} finally {
return 20; // => 事前に return があっても必ず finallyブロック は実行されます
}

🐰 補足:到達不可能なcatchブロックはコンパイルエラー

複数のcatchブロックがあって到達不可能なコードがある場合、コンパイルエラーになるので注意してください。

🚜 補足:例外の種類

例外クラス 例外の発生条件
ExceptionInInitializerError static初期化時に何らかのトラブルが発生した場合
IllegalArgumentException 利用される側のオブジェクトが不正な引数を渡されたことを通知するため
IllegalStateException 利用される側のオブジェクトがまだ利用するための準備が終わっていない場合
NoClassDefFoundError JVMが実行対象のクラスファイルを発見できなかったとき
NullPointerException nullに対してメソッドを呼び出すようなコードの場合
NumberFormatException 文字列を数字に変換しようとして、文字列の形式が正しくない場合
OutOfMemoryError ヒープメモリ(インスタンス、クラス定義を保存)がいっぱいになった場合

🤔 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍