【Java】1つのtryブロックに複数のcatchブロックを定義する方法と優先順位の仕組み
はい、Javaでは1つのtryブロックに対して複数のcatchブロックを定義できます。これにより、発生しうる例外の種類ごとに異なる処理を記述でき、よりきめ細かいエラーハンドリングが可能になります。
複数のcatchブロックを使う際の基本ルール
- すべてのtryブロックには、必ず少なくとも1つのcatchブロック(またはfinallyブロック)を関連付ける必要があります。
- tryブロック内で例外オブジェクトが検出されると、JVMはcatchブロックを記述された順序(上から下へ)で照合していきます。
- 最優先で判定されるのは常に最初のcatchブロックです。最初のcatchブロックでその例外を処理できない場合は、直後の次のcatchブロックが判定対象となります。
- 一致するcatchブロックが見つかった時点でそのブロックのみが実行され、残りのcatchブロックはすべてスキップされます。
サンプルコード
class TryWithMultipleCatch {
public static void main(String args[]) {
try {
int a[] = new int[5];
a[3] = 10 / 0;
System.out.println("tryブロック内の出力文");
} catch(ArithmeticException e) {
System.out.println("警告: ArithmeticException");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("警告: ArrayIndexOutOfBoundsException");
} catch(Exception e) {
System.out.println("警告: その他の例外");
}
System.out.println("try-catchブロックの外側");
}
}
この例では、10 / 0 の除算によって ArithmeticException が発生します。代入文は右辺の評価が先に行われるため、配列の範囲外アクセスによる例外は発生しません。
実行結果
警告: ArithmeticException try-catchブロックの外側
ArithmeticException を処理する最初のcatchブロックが実行され、その後はプログラムが正常に続行されていることがわかります。
注意点:catchブロックの並び順
catchブロックを並べる際は、サブクラスの例外を先に、スーパークラスの例外を後に記述する必要があります。たとえば、すべての例外のスーパークラスである Exception を最初に記述すると、それ以降のcatchブロックが到達不可能になり、コンパイルエラーが発生します。
補足:マルチキャッチ構文(Java 7以降)
Java 7以降では、複数の例外を同じ方法で処理したい場合に、パイプ(|)を使ったマルチキャッチ構文を利用できます。
try {
// 例外が発生する可能性のある処理
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("算術例外または配列範囲外例外が発生しました");
}
これにより、似たようなcatchブロックの重複を減らし、コードの可読性を高めることができます。
まとめ
- Javaでは1つのtryブロックに複数のcatchブロックを定義できる。
- catchブロックは記述順に判定され、最初に一致したものだけが実行される。
- サブクラスの例外を先に、スーパークラスの例外を後に記述するのが鉄則。
- Java 7以降はマルチキャッチ構文で複数の例外をまとめて処理できる。
-
Javaのcatchブロックやfinallyブロックでreturn文は使える?使い方と注意点を解説
はい、Javaではcatchブロックやfinallyブロックの中にメソッドのreturn文を記述することができます。ここでは、それぞれのブロックでreturn文を使う際の動作と注意点について詳しく解説します。return文の基本的なルールメソッドが戻り値の型を持つ場合、条件に応じてメソッド内の任意の場所で値を返すことができます。catchブロックで値を返し、さらにメソッドの末尾でも値を返す場合、コードは正常にコンパイル・実行されます。catchブロックで値を返した後に、メソッドの末尾へ追加のコードを記述した場合、その部分は決して実行されない「到達不可能なコード(unreachable code
-
Javaでcatchブロックなしのtryブロックは使える?finallyとの組み合わせを解説
はい、可能です。Javaでは、tryブロックにcatchブロックを付けずに、finallyブロックと組み合わせて使用することができます。finallyブロックは、tryブロック内で例外が発生したかどうかにかかわらず必ず実行されるという特徴があります。唯一の例外は System.exit() を呼び出した場合です。この場合、JVM自体が終了するため、finallyブロックは実行されません。この「try-finally」構文は、例外処理を行わなくても、後処理(リソースの解放や接続のクローズなど)を確実に実行したい場合に役立ちます。例1:基本的なtry-finally構文public class T