3️⃣
例外処理
概要
「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