English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
本教程では、サンプルを使ってJavaで複数の例外を処理する方法を学びます。
Java 7それ以前は、コードの冗長があっても、異なるタイプの例外に対して複数の例外処理コードを書かなければなりませんでした。
例を示しましょう。
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が例外を投げ出し始めます。
Java SE 7より高いバージョンでは、現在、単一のcatchブロックで複数のタイプの例外をキャッチすることができます。
catchブロックで処理できるすべての例外タイプは、竖線(|)で区切られます。
その文法は以下の通りです:
try { // コード catch(ExceptionType1 | 例外タイプ2 ex) { // 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ブロック内に例外の階層構造がある場合、基本例外のみをキャッチし、複数の専門的な例外をキャッチすることはできないということを意味します。
例を示しましょう。
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ブロックで基本例外クラスが指定されている場合、そのブロック内で子例外クラスを使用しないでください。そうしないと、コンパイルエラーが発生します。
例を示しましょう。
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クラスのサブクラスです。したがって、コンパイルエラーを投げ出します。