Java 速習チュートリアル

Java の複数例外処理

1. 1つの try に対して複数の catch

1つの try ブロックの中で、異なる種類のエラー(エクセプション)が発生する場合があります。これらを処理するには、複数の catch ブロックを使用します。

複数の catch ブロックを追加すると、Javaはスロー(Throw)されたエクセプションの型に一致する最初のブロックを実行します。

実装例:

public class Main {
  public static void main(String[] args) {
    try {
      int[] numbers = {1, 2, 3};
      System.out.println(numbers[10]);  // ArrayIndexOutOfBoundsException が発生
      int result = 10 / 0;              // ArithmeticException が発生
    } 
    catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("配列のインデックスが存在しません。");
    } 
    catch (ArithmeticException e) {
      System.out.println("ゼロで割ることはできません。");
    } 
    catch (Exception e) {
      System.out.println("その他のエラーが発生しました。");
    }
  }
}

結果:

配列のインデックスが存在しません。

解説:
最初に発生したエクセプション(ArrayIndexOutOfBoundsException)のみがスローされるため、それに一致する最初の catch ブロックだけが実行されます。

2. 記述する順序の重要性

エクセプションをキャッチする際は、より具体的なエクセプションを先に一般的な(抽象的な)エクセプションを後に記述する必要があります。そうしないと、一般的な catch ブロックがすべてのエラーを先に拾ってしまい、具体的な catch ブロックが実行されなくなるためです。

例(不適切な順序):

try {
  int result = 10 / 0;
} catch (Exception e) {
  System.out.println("一般的なエラーです。");
} catch (ArithmeticException e) {
  // ここには決して到達しません
  System.out.println("ゼロ除算エラーです。");
}

       ヒント: 最も汎用的な Exception クラスは、常に 最後 に配置するようにしてください。

3. マルチキャッチ (Multi-Catch)

Java 7 以降、| 記号を使用することで、1つの catch ブロックで複数のエクセプションをキャッチできるようになりました。これは、異なる種類のエクセプションに対して同じ処理を行いたい場合に、コードの重複を避けるために非常に有用です。

実装例:

try {
  int result = 10 / 0;
  int[] numbers = {1, 2, 3};
  System.out.println(numbers[10]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
  System.out.println("計算エラーまたは配列エラーが発生しました。");
}

このマルチキャッチ構文を利用することで、ボイラープレートコード(定型文)を削減し、可読性の高いクリーンなコードを維持することができます。複雑なロジックにおいて、特定のエクセプションのみをまとめて処理したい場合に非常に効果的です。