Java の連鎖例外を使用すると、ある例外を別の例外に関連付けることができます。つまり、1 つの例外が別の例外の原因を説明します。
- たとえば、メソッドが 算術例外 ゼロで除算しようとしたため。
- しかし、エラーの根本原因は、除数がゼロになる I/O 障害でした。
- このような場合、連鎖例外は、エラーの主な原因と根本的な原因の両方を伝播するのに役立ちます。
例 : 次の例は、Java で連鎖例外を使用する方法を示しています。
Java// Working of chained exceptions public class Geeks { public static void main(String[] args) { try { // Creating an exception NumberFormatException ex = new NumberFormatException('Primary Exception'); // Setting the cause of the exception ex.initCause(new NullPointerException('Root cause of the exception')); // Throwing the exception with a cause throw ex; } catch (NumberFormatException ex) { // Displaying the primary exception System.out.println('Caught Exception: ' + ex); // Displaying the root cause of the exception System.out.println('Cause of Exception: ' + ex.getCause()); } } }
出力
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
注記: ネストされた例外とも呼ばれる連鎖例外を使用すると、Java で原因を例外に関連付けることができます。これは、例外の元の原因に関する情報を伝達したい場合に便利です。
コンストラクター
- Throwable(投げられる原因) : ここで、「原因」は、現在の例外を引き起こした例外です。
- Throwable(String msg スロー可能な原因) : msg は例外メッセージ、cause は現在の例外の原因となった例外です。
連鎖例外をサポートするスロー可能メソッド
- getCause() : このメソッドは、例外の実際の原因を返します。
- initCause(スロー可能な原因) : このメソッドは、呼び出し例外の原因を設定します。
例: 連鎖例外を含むカスタム メッセージの使用
Java では、Throwable クラスのコンストラクターを使用して例外を連鎖させることができます。
Java// Use a custom message with chained exception public class Geeks { public static void main(String[] args) { try { // Code that might throw an exception int[] n = new int[5]; int divisor = 0; for (int i = 0; i < n.length; i++) { int res = n[i] / divisor; System.out.println(res); } } catch (ArithmeticException e) { // Creating a new exception with // the original as the cause throw new RuntimeException ('Error: Division by zero occurred' e); } } }
出力:
Javaは文字を文字列に変換します
説明: この例では、整数の配列であり、除数を 0 に設定します。
- try ブロック内で、配列の各要素を 0 で除算しようとすると、ArithmeticException がスローされます。
- この ArithmeticException は catch ブロックでキャッチされ、そこで元の例外 (ArithmeticException など) を原因として新しい RuntimeException が作成されます。
- RuntimeExceptionが捕捉されないため、RuntimeExceptionとArithmeticExceptionを含むスタックトレースが表示されます。
連鎖例外の利点:
連鎖例外の利点を以下に示します。
- この例外は、主な原因と根本原因の両方に関する詳細を提供するため、デバッグに役立ちます。
- 完全な例外コンテキストの伝播を有効にすることにより、エラー処理が簡素化されます。
- これにより、複雑なアプリケーションにおけるエラーの追跡可能性が向上します。
連鎖例外の欠点:
- 適切に使用しないと、スタック トレースが長くなり、読みにくくなる可能性があります。
- 過度に使用すると、例外が不必要に連鎖した場合に、わかりにくいエラー メッセージが発生する可能性があります。
- 開発者は、意味のある原因がリンクされていることを確認する必要があります。そうしないと、デバッグ中に誤解を招く可能性があります。