【自分メモ】Javaの例外処理~catch文には順序がある~

Javaの例外処理について

先日、例外処理のところで悩んでいたら、Javaの例外処理を行うcatch句は順序ちゃんとしとかないといけないよといわれて、「え、順序?」となったので調べてみた。

例外処理の基礎

try、catch、finallyの順序で記述し、try句の中で起こった例外をcatch句で補足してなんらかの処理をし、最終的な処理をfinally句で行う。 サンプルコード(https://www.javadrive.jp/start/exception/index2.html より一部改変)

class JSample2_1{
	public static void main(String args[]){
		int n[] = {18, 29, 36};

		System.out.println("開始します");

		try{
		  for (int i = 0; i < 4; i++){
		    System.out.println(n[i]);
		  }
		}
		catch(ArrayIndexOutOfBoundsException e){
		  System.out.println("配列の範囲を超えています");
		}
		finally {
			System.out.println("終了しました");
		}
	}
}

添え字が配列の範囲を超えてしまった場合、ArrayIndexOutOfBoundsExceptionが発生し、catch句で補足されて、「配列の範囲を超えています」というメッセージをコンソールに出力し、finally句で「終了しました」と出力したあとに終了する。 例外が発生しない場合でも、ここではfinally句にあるため、「終了しました」は必ず出力される。

catchブロックの順序

ところで本題だけど、try句の中で複数の例外が発生する可能性があるとき、当然catch句も複数書くことになると思うのだが、catch句は書く順序が大切らしい。

順序を間違えるとどういうことになるかというと、コンパイルエラーが起きる。 このコンパイルエラーは、クラスの上下関係みたいなものに起因するらしい。

クラスは継承する側と継承される側があって、継承する側がサブクラス(下)で継承される側がスーパークラス(上)。

catch文は上から順に評価されていくけど、スーパークラスで先に例外を補足してしまうと、その下に書いたサブクラスには行きつかないので、コンパイルエラーになる。 なので、サブクラスから順に書き、最後にスーパークラスを書く。

参考

【はじめてのJava】複数のcatchブロック【例外処理編】 | TECH PROjin