「複数のcatchブロックで例外処理をしているのはなぜ?」
「どういう動きになるの?」
「引数の中身はどうすればいいの?」
という方のために、catchブロックを複数使う意味と、実際の挙動を解説します。
catchブロックを複数使う意味
catchブロックを複数使う理由は、エラーの種類によって処理を分けるためです。
偏にエラーといっても、様々な種類があります。
例えば、
・入出力に関するエラー
・データベースへのアクセスに関するエラー
・不正な計算(0で割るなど)によるエラー
などなど、種類は様々です。
catchブロックを複数書くことで、tryブロックで発生したエラーの種類に応じて処理を分けることができます。
次の章で、実際のコードを見ながらその挙動を解説していきます。
複数catchブロックがある時の挙動
複数catchブロックがある時の挙動は以下のようになります。
tryブロックでエラー(例外)が発生すると、1番上に書かれているcatchブロックへ処理が移ります。
しかし、1番上のcatchブロックは「例外クラス1」の例外が発生した時に処理するためのブロックなので、「例外クラス1」以外の例外では処理は実行されません。
次に、2番目のcatchブロックへ処理が移ります。
2番目のcatchブロックは「例外クラス2」の例外が発生した時に処理するブロックなので、処理が実行されます。
あるcatchブロックの処理が実行されると、それ以降のcatchブロックは実行されません。
そのため、今回の例では、2番目以降にいくらcatchブロックを書いても処理はされません。
実際のコードも載せておきます。
8行目、11行目のどちらかをコメントアウトして実行してみてください。
8行目の処理では不正な添字を使用する例外が発生し、2番目のcatchブロックが実行されます。
11行目の処理では不正な計算による例外が発生し、1番目のcatchブロックが実行されます。
public class Sample {
public static void main(String[] args) {
int[] num = {0, 3, 8, 9};
try {
//①不正な添字を使用している
System.out.println(num[5]);
//②不正な計算が行われている
num[4] = num[1] / num[0];
}catch(ArithmeticException e) {
//不正な計算が行われた時に実行
System.out.println("不正な計算が行われたよ");
}catch(IndexOutOfBoundsException e) {
//不正な添字が用いられた時に実行
System.out.println("不正な添字が用いられたよ");
}catch(NullPointerException e) {
//オブジェクトの中身がnullだった時に実行
System.out.println("オブジェクトがnullだよ");
}finally {
//必ず実行
System.out.println("処理終了");
}
}
}
実行結果
8行目をコメントアウト(11行目を実行)した場合
11行目をコメントアウト(8行目を実行)した場合
ここで1つ注意点があります。
catchブロックの引数は、必ず子クラスから先に書いてください。
(子クラスより先に親クラスを記述すると、コンパイルエラーが起きます)
例外クラスにも以下のような継承関係が存在しています。
子クラスでキャッチできる例外は、親クラスもキャッチできます。
そのため、子クラスより先に親クラスを記述してしまうと、親クラス以降のcatchブロックはどのような場合でも処理が行われなくなるのです。
まとめ
catchブロックを複数使う意味
例外(エラー)の種類に応じて処理を分けるため
複数catchブロックがある時の挙動
・発生した例外とcatchブロックの引数が一致すれば処理が実行される
・1つのcatchブロックの処理が実行されたら、その他のcatchブロックの処理は実行されない
・catchブロックの引数は子クラスから先に記述する
コメント