1. 概要

Javaのthrowキーワードは、カスタムメイドの例外または組み込みの例外のいずれかを明示的にスローするために使用されます。ただし、 catch ブロックでは、次のことを行う必要があります。同じ例外を再度スローします。 これにより、例外が再スローされます。

このチュートリアルでは、例外を再スローする最も一般的な2つの方法について説明します。

2. 例外を再スローする

例外をより高いレベルに伝播する前に、いくつかのアクティビティを実行したい場合があります。 たとえば、DBトランザクションをロールバックしたり、例外をログに記録したり、電子メールを送信したりすることができます。

このようなアクティビティをcatchブロックで実行し、例外を再度スローすることができます。 このようにして、システムで例外が発生したことが上位レベルに通知されます。

例を挙げて私たちのケースを理解しましょう。

以下では、同じ例外を再スローしています。 そして、それを投げる直前にエラーメッセージをログに記録しています:

String name = null;

try {
    return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
    // log
    throw e;
}

コンソールに次のメッセージが表示されます。

Exception in thread "main" java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

ご覧のとおり、コードはキャッチした例外を再スローします。 このため、変更なしで元のスタックトレースを取得します

3. 例外のラッピング

それでは、別のアプローチを見てみましょう。

この場合、別の例外のコンストラクターの参照と同じ例外を渡します。

String name = null;

try {
    return name.equals("Joe"); // causes NullPointerException
} catch (Exception e) {
    // log
    throw new IllegalArgumentException(e);
}

コンソールには次のように表示されます。

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24)
Caused by: java.lang.NullPointerException
  at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18)

今回は、元の例外とラッピングの例外が表示されます。 このようにして、IllegalArgumentExceptionインスタンスは元のNullPointerExceptionをcauseとしてラップします。 したがって、一般的な例外を表示する代わりに、より具体的な例外を表示できます。

4. 結論

この短い記事では、元の例外を再スローすることと、最初にそれをラップすることの主な違いを示しました。 両方の方法は、例外メッセージを表示する方法が互いに異なります。

要件に基づいて、同じ例外を再スローするか、2番目のアプローチを使用して特定の例外でラップすることができます。 2番目のアプローチは、例外をよりクリーンで簡単にバックトラックできるように見えます。

いつものように、プロジェクトはGitHub利用できます。