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