Javaは複数の例外をキャッチします
Java が複数の例外をキャッチ
このチュートリアルでは、例を使って Java で複数の例外を処理する方法を学びます。
Java 7 より前は、コードの冗長性があっても、さまざまな種類の例外に対して複数の例外処理コードを記述する必要がありました。
例を見てみましょう。
例 1:複数の catch ブロック
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
この例では、次の 2 つの例外が発生する可能性があります:
ArithmeticException
数値を 0 で割ろうとしているからです。ArrayIndexOutOfBoundsException
これは、0 から 9 までの配列境界を持つ新しい整数配列を宣言し、インデックス 10 に値を代入しようとしているためです。
catch
の両方で例外メッセージを出力しています ブロック、つまり重複コード。
代入演算子 =
の結合性 は右から左なので、ArithmeticException
/ by zero
というメッセージで最初にスローされます .
catch ブロックで複数の例外を処理する
Java SE 7 以降では、単一の catch
で複数のタイプの例外をキャッチできるようになりました ブロックします。
catch
で処理できる各例外タイプ ブロックは縦棒またはパイプ |
を使用して区切られます .
その構文は次のとおりです:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
例 2:マルチキャッチ ブロック
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
です .これは、キャッチ パラメータに値を割り当てることができないことを意味します。
ベース例外のキャッチ
1 つの 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
で基底例外クラスがすでに指定されている場合 ブロック、同じ 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: error: Alternatives in a multi-catch statement cannot be related by subclassing
この例では、ArithmeticException
と ArrayIndexOutOfBoundsException
両方とも Exception
のサブクラスです クラス。したがって、コンパイル エラーが発生します。
Java