3️⃣

例外処理

2024/05/28に公開

概要

「Java SE 11 Programmer II (1Z0-816-JPN) 試験」の出題範囲「例外処理」の自己学習メモになります

例外クラス

checked例外とunchecked例外

  • Errorクラスおよびそのサブクラス(unchecked例外)
  • RuntimeExceptionクラスおよびそのサブラクラス(unchecked例外)
  • RuntimeExceptionクラス以外のExceptionのサブクラス(checked例外)

独自例外クラスの作成

構文

[修飾子] class クラス名 extends Exception {}

主な例外クラス

カテゴリ クラス名 説明
checked例外 IOException 入出力を行う場合に発生
checked例外 FileNotFoundException ファイル入出力において、目的のファイルがなかった場合に発生
checked例外 ParseException 解析中に予想外のエラーがあった場合に発生
checked例外 SQLException データベース・アクセス時にエラーがあった場合に発生

try-catch-fanlly

  • try-catch-fanllyによる例外処理
  • throwsキーワードによる例外処理

try-catch-fanllyの組み合わせ

  • try-catch
  • try-fanlly
  • try-catch-fanlly

複数のcatchブロック構文

マルチキャッチ

try {

} catch (NumberFormatException | ArithmeticException) {

}

継承関係のある例外クラスは列記できないサンプルコード

try {

} catch (FileNotFoundException | IOException) { // NG
//} catch ( IOException | FileNotFoundException) { // NG

}

キャッチした参照変数は暗黙的にfinalになるサンプルコード

try {

} catch (NumberFormatException | ArithmeticException e) {
    e = null;

} catch (IOException e) {
    e = null;

}

実行結果

Mail.java:10: エラー: 複数のcatchパラメータeに値を代入することはできません

    e = null;

エラー1個

throwsとthrow

throws

構文

[修飾子] 戻り値の型 メソッド名(引数) throws 例外クラス名

throw

構文

throw new IOException();

rethrow

オーバライド時の注意点

throwsのルール

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

ルールのまとめ

  • オーバライドとは、メソッド名、引数リストがまったく同じメソッドをサブクラスで定義すること
  • 戻り値は、スーパークラスで定義したメソッドが返す型と同じか、その型のサブクラスとする
  • アクセス修飾子は、スーパークラスと同じものか、それよりも公開範囲が広いものであれば可能
  • throwsには、スーパークラスのメソッドがthrowsに指定した例外クラスとそのサブクラスが指定できる
  • RuntimeExceptionおよびそのサブクラスは、制約なしにthrowsに指定できる
  • スーパークラスのメソッドにthrowsがあっても、throwsを指定しなくても良い

try-with-resources

定義例

tryブロック内でリソースをインスタンス化する

try (MyResource obj1 = new MyResource("obj1")) { }

var を使用した変数宣言

try (var obj = new MyResource("obj1")) { }

事前にインスタンス化した変数を使用する

MyResource obj1 = new MyResource("obj1");
try(obj1) { }

メソッドで受け取った変数を利用する

void (MyResource obj1) {
    try(obj1) { }
}

コンパイルエラーになるサンプルコード

try (MyResource obj1 = new MyResource("obj1") ) {
    obj1 = new MyResource("obj1");
}

アサーション

構文

assert boolean 式 :
assert boolean 式 : メッセージ;
java -ea Main
java -da:Foo -ea Main

Discussion