【Java】到達できないcatchブロックはコンパイルエラー

try~catchブロックを使用した例外処理でtryブロックの中で複数種類の例外が発生する場合、
例外の種類に合わせて複数のcatchブロックを書いて処理することができる。


tryブロック内の処理に対して、複数のcatchブロックを記述した例

public class Sample {
	public static void main(String[] args) {
		try{
			//正常に割り算が処理される
			int result = new Calculation().divid(10, 2);
			System.out.println(result);

			int[] numbers = {1,2,3};
			//配列の範囲外にアクセスして例外となる
			System.out.println(numbers[3]);

		}catch(ArithmeticException e) {
			System.out.println("割り切れません。");
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("配列の範囲外です");
		}
	}
}
class Calculation {
	public int divid(int x, int y) {
		return x / y;
	}
}
ArithmeticException
ArrayIndexOutOfBoundsException

二つのcatchブロックで上記のどちらの例外が発生してもキャッチできるようにしている。


複数種類の例外をExceptionでまとめてキャッチする例

public class Sample {
	public static void main(String[] args) {
		try{
			//割り切れないので例外となる
			int result = new Calculation().divid(10, 0);
			System.out.println(result);

			int[] numbers = {1,2,3};
			//配列の範囲外にアクセスして例外となる
			System.out.println(numbers[3]);
		//すべての例外をキャッチしている
		}catch(Exception e) {
			System.out.println("例外が発生しました。");
		}
	}
}
class Calculation {
	public int divid(int x, int y) {
		return x / y;
	}
}

catchブロックに指定する例外クラスを「Exception」とする事でtryブロックで発生するすべての種類の例外に対応することが出来る。(12行目)
(すべての例外クラスのスーパークラスはExceptionクラスであるため。)


特定の例外は例外クラス名を明示的に書き、それ以外の例外はExceptionでキャッチする例

ArithmeticException以外の例外はExceptionでまとめてキャッチする。

public class Sample {
	public static void main(String[] args) {
		try{
			//正常に割り算が処理される
			int result = new Calculation().divid(10, 2);
			System.out.println(result);

			int[] numbers = {1,2,3};
			//配列の範囲外にアクセスして例外となる
			System.out.println(numbers[3]);
		//特定の例外を処理
		}catch(ArithmeticException e) {
			System.out.println("割り切れません");
		//その他の例外を処理
		}catch(Exception e) {
			System.out.println("例外が発生しました");
		}
	}
}
class Calculation {
	public int divid(int x, int y) {
		return x / y;
	}
}

実行結果 (コンソールに出力)

5
例外が発生しました

 

注意 catchブロックへ到達不能となりコンパイルエラーとなる例

public class Sample {
	public static void main(String[] args) {
		try{
			//正常に割り算が処理される
			int result = new Calculation().divid(10, 2);
			System.out.println(result);

			int[] numbers = {1,2,3};
			//配列の範囲外にアクセスして例外となる
			System.out.println(numbers[3]);
		//すべての例外を処理
		}catch(Exception e) {
			System.out.println("例外が発生しました");
		//到達不可能なcatchブロック
		}catch(ArithmeticException e) {
			System.out.println("割り切れません");
		}
	}
}
class Calculation {
	public int divid(int x, int y) {
		return x / y;
	}
}

上記のように特定の例外(今回はArithmeticException)をキャッチするcatchブロックより前にあるcatchブロックにExceptionが指定されている場合、tryブロック内の全ての処理が初めのcatchブロックで処理されてしまう。

よって、後ろのcatchブロックは到達不能でコンパイルエラーとなる。

Follow me!