「複数の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ブロックが実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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ブロックの引数は子クラスから先に記述する
コメント