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