【Java】複数のcatchブロックを使った例外処理

複数のcatchブロックを使った例外処理_アイキャッチ画像 Java

「複数の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ブロックの引数は子クラスから先に記述する

コメント

タイトルとURLをコピーしました