6 章
catch ブロック
要点
- catch ブロックは複数定義することができる
- 例外クラス間に継承関係がある場合は、サブクラスから記述しなければならない
😡
try {
...
} catch(Exception e1) { // 【😡】 スーパークラスから記述している
...
} catch (ArrayIndexOutOfBoundsException e2) { // そのため、この行に到達できない
...
}
😊
try {
...
} catch (ArrayIndexOutOfBoundsException e1) { // 【😊】 サブクラスから記述
...
} catch (Exception e2) {
...
}
マルチキャッチ
要点
- 複数の例外をまとめてキャッチする記述
- 継承関係のある例外クラス同士は列記できない
😡
public class Main {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("foo.md");
// 【😡】 'IOException' と 'FileNotFoundException' は継承関係
} catch (IOException | FileNotFoundException | ArithmeticException e) {
System.out.println("Error Message: " + e.getMessage());
}
}
}
😊
public class Main {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("foo.md");
} catch (FileNotFoundException | ArithmeticException e) { // 【😊】 継承関係ではない
System.out.println("Error Message: " + e.getMessage());
}
}
}
throws と オーバーライド
スーパークラスのメソッドに throws xxx
と付いている場合、オーバーライドをする側でも throws
のハンドリングを行う必要があります。
要点
- throws を記述しなくてもいい
- サブクラスの指定はできる
- 同一の例外クラスの指定はできる
- スーパークラスの指定はできない
- 継承関係にない例外クラスの指定はできない
class Super {
protected void method() throws IOException {}
}
class Sub extends Super {
// 【😊】 throwsを記述しなくても問題ない
protected void method() {}
// 【😊】 FileNotFoundException は IOException のサブクラス
protected void method() throws FileNotFoundException {}
// 【😊】 同一の例外クラス
protected void method() throws IOException {}
// 【😊】 RuntimeException および RuntimeException のサブクラスはスーパークラスのメソッドに関係なくスローできる
protected void method() throws RuntimeException {}
// 【😡】 Exception は IOException のスーパークラス
protected void method() throws Exception {}
// 【😡】 ClassNotFoundException は IOException と継承関係にない
protected void method() throws ClassNotFoundException {}
}
throws を付ける基準
throws を付ける基準
例外をスロー
するメソッド- 例外をスローするメソッドを
呼び出しているメソッド
public class Main {
public static void main(String[] args) { // 3
x();
}
static void x() { // 2
y();
}
static void y() { // 1
throw new Exception();
}
}
解説
- y() は例外をスローするメソッドのなので、
throws Exception
を付けなければならない - x() は例外をスローするメソッドを呼び出しているメソッドなので、
throws Exception
を付けなければならない - 2 と同じ