1. ホーム
  2. java

[解決済み] Javaでカスタム例外を作成するには?[クローズド]

2022-04-28 02:46:12

質問

Javaでカスタム例外を作成するには?

どのように解決するのですか?

を定義するには チェック済み のサブクラス (またはサブクラスの階層) を作成し、例外を発生させます。 java.lang.Exception . 例えば

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

この例外を投じたり伝播したりする可能性のあるメソッドは、それを宣言しなければなりません。

public void calculate(int i) throws FooException, IOException;

... そして、このメソッドを呼び出すコードは、この例外を処理するか、伝播させるか(あるいはその両方)のどちらかを行わなければなりません。

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

上記の例でお気づきのように IOException として捕捉され、投げ直されます。 FooException . これは、例外をカプセル化するためによく使われる手法です(通常、APIを実装する場合)。

時には、すべてのメソッドが throws 節で例外の実装を宣言することを強制したくない状況もあるでしょう。 このような場合は チェックなし 例外が発生します。 未チェックの例外とは、以下のような例外を指します。 java.lang.RuntimeException (のサブクラスである)。 java.lang.Exception ):

public class FooRuntimeException extends RuntimeException {
  ...
}

メソッドが投げたり伝搬したりする FooRuntimeException 例外を宣言することなく使用できます。

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

チェックされていない例外は、通常、プログラマーのエラーを示すために使用されます。例えば、メソッドに無効な引数を渡したり、配列のインデックス境界を突破しようとした場合などです。

java.lang.Throwable クラスは、Javaで投げられるすべてのエラーと例外の根源です。 java.lang.Exception java.lang.Error のサブクラスです。 Throwable . をサブクラスとするもの Throwable をスローまたはキャッチすることができます。 しかし、一般的に、キャッチしたり投げたりするのはバッドプラクティスです。 Error これは、通常プログラマが "handled"できないJVM内部のエラーを示すために使われるからです(例えば、以下のようなものです。 OutOfMemoryError ). 同様に Throwable をキャッチしてしまう可能性があります。 Error に加えて Exception s.