English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基础教程

Java フローコントロール

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 異常処理

Java リスト(List)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Java入出力(I/O)

Java Reader/Writer

Javaの他のトピック

Javaで複数の例外をキャッチし処理

本教程では、サンプルを使ってJavaで複数の例外を処理する方法を学びます。

Java 7それ以前は、コードの冗長があっても、異なるタイプの例外に対して複数の例外処理コードを書かなければなりませんでした。

例を示しましょう。

例1:複数のキャッチブロック

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    catch(ArithmeticException e) {
      System.out.println(e.getMessage());
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    } 
  }
}

出力結果

/ by zero

この例では、二つの例外が発生する可能性があります:

  • ArithmeticException -  私たちは0で割ることを試みました。

  • ArrayIndexOutOfBoundsException -  新しい整数配列が宣言されており、配列の境界は0から9と、インデックス10値を割り当てます。

私たちは二つのcatchブロックで例外メッセージを出力します。これは、重複のコードです。

代入演算子(=)の関連性は右から左です。したがって、まずArithmeticExceptionとメッセージ / by zeroが例外を投げ出し始めます。

catchブロックで複数の例外を処理

Java SE 7より高いバージョンでは、現在、単一のcatchブロックで複数のタイプの例外をキャッチすることができます。

catchブロックで処理できるすべての例外タイプは、竖線(|)で区切られます。

その文法は以下の通りです:

try {
  // コード
catch(ExceptionType1 | 例外タイプ2 ex) { 
  // catchブロック
}

例2:単一のcatchブロックで複数の例外をキャッチ

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    catch(ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

出力結果

/ by zero

単一のcatchブロックで複数の例外をキャッチすることで、コードの冗長を減らし、効率を向上させることができます。

このプログラムをコンパイルする際に生成されるバイトコードは、複数のcatchブロックを持つプログラムよりも小さいです。なぜなら、コードの冗長がありませんからです。

注意:複数の例外を処理するcatchブロックがある場合、catchパラメータは暗黙的にfinalです。これは、キャッチパラメータに値を割り当てることができないことを意味します。

基本例外をキャッチ

単一のcatchブロックで複数の例外をキャッチする場合、このルールは専門化ルールに一般化されます。

これは、catchブロック内に例外の階層構造がある場合、基本例外のみをキャッチし、複数の専門的な例外をキャッチすることはできないということを意味します。

例を示しましょう。

例3:基本例外クラスのみキャッチ

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    catch(Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

出力結果

/ by zero

すべての例外クラスはExceptionクラスのサブクラスです。したがって、複数の専門的な例外をキャッチする必要はなく、Exceptionクラスのみをキャッチすれば十分です。

既にcatchブロックで基本例外クラスが指定されている場合、そのブロック内で子例外クラスを使用しないでください。そうしないと、コンパイルエラーが発生します。

例を示しましょう。

例4:基準クラスとサブクラスの例外をキャッチ

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

出力結果

Main.java:6: エラー: マルチセレクトのオプション-catch 文はサブクラスを通じて関連付けられません

この例では、ArithmeticExceptionとArrayIndexOutOfBoundsExceptionはExceptionクラスのサブクラスです。したがって、コンパイルエラーを投げ出します。