Java で複数の例外をスローする

Mohd Ebad Naqvi 2023年10月12日
Java で複数の例外をスローする

このチュートリアルでは、Java で複数の例外をスローする方法を示します。

例外は、プログラムの実行中に命令の通常のフローを中断させる、望ましくない予期しないイベントです。すべての Java 例外のルートクラスは java.lang.Throwable です。このクラスは、Error サブクラスと exception サブクラスに継承されます。

例外を処理するために、try...catch ブロックを使用します。

try ブロックに、いくつかの例外を発生させる可能性のあるコードを配置します。try ブロックは単独では使用されません。常に catch または finally が続く必要があります。catch ブロックは、例外をキャッチするために使用されます。このブロックの後に finally ブロックを続けることができます。finally ブロックは、例外の有無に関係なく、プログラムの重要なコードを実行するために使用されます。

Java では、複数の例外に対処しなければならない場合があります。Java では多数の例外をスローすることはできません。複数の例外を指定できますが、スローされるのはそのうちの 1つだけです。

ただし、複数の例外のスローをシミュレートするために使用できるいくつかの選択肢があります。

複数の例外を処理するために連鎖例外を使用できます。このような例外は、発生した例外が別の例外によって引き起こされていることを示しています。

例えば、

public class Main {
  public static void main(String[] args) {
    try {
      NumberFormatException ex = new NumberFormatException("NumberFormatException is thrown");
      ex.initCause(new NullPointerException("NullPointerException is the main cause"));
      throw ex;
    }

    catch (NumberFormatException ex) {
      System.out.println(ex);
      System.out.println(ex.getCause());
    }
  }
}

出力:

java.lang.NumberFormatException: NumberFormatException is raised
java.lang.NullPointerException: NullPointerException is the main cause

initCause() および getCause() メソッドの使用に注意してください。initCause() 関数は例外の原因を別の例外として設定し、getCause() は例外の原因を返します。この場合は NullPointerException です。

抑制された例外を使用することもできます。ここでは、抑制された例外をプライマリ例外にアタッチします。Java7 で追加されました。

抑制された例外をアタッチするには、addSuppressed() 関数を使用します。この関数は、メインの例外オブジェクトとともに使用します。

例えば、

import java.io.*;
class Main {
  public static void main(String[] args) throws Exception {
    try {
      Exception suppressed = new NumberFormatException();
      Exception suppressed2 = new NullPointerException();

      final Exception exe = new Exception();

      exe.addSuppressed(suppressed);
      exe.addSuppressed(suppressed2);
      throw exe;

    }

    catch (Throwable e) {
      Throwable[] suppExe = e.getSuppressed();
      System.out.println("Suppressed:");
      for (int i = 0; i < suppExe.length; i++) {
        System.out.println(suppExe[i]);
      }
    }
  }
}

出力:

Suppressed:
java.lang.NumberFormatException
java.lang.NullPointerException

上記の例では、メインオブジェクトに 2つの例外をアタッチし、抑制された例外を出力しました。抑制されたすべての例外を取得するには、getSuppressed() 関数を使用します。

関連記事 - Java Exception