web-dev-qa-db-ja.com

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

Javaでカスタム例外を作成するにはどうすればよいですか?

146
Suresh Chaganti

checked例外を定義するには、 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句で例外実装を宣言することを強制したくない場合があります。この場合、unchecked例外を作成できます。未チェックの例外は、 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.ExceptionJava.lang.Error は、両方とも Throwable のサブクラスです。サブクラス Throwable がスローまたはキャッチされる可能性があります。ただし、 Error をキャッチまたはスローすることは一般的に悪い習慣です。これは、プログラマが通常「処理」できないJVM内部のエラーを示すために使用されるためです(例 OutOfMemoryError )。同様に、 Throwable をキャッチすることを避ける必要があります。これは Error sに加えて Exception sをキャッチすることになります。

280
Adamski
public class MyException extends Exception {
        // special exception code goes here
}

次のように投げます:

 throw new MyException ("Something happened")

キャッチ:

catch (MyException e)
{
   // something
}
25
laura

チェック済み例外の場合:

public class MyCustomException extends Exception { }

技術的には、Throwableを拡張するものはすべてスローできますが、例外は一般にExceptionクラスの拡張であるため、他の一般的なタイプとは対照的に、例外をチェックします(RuntimeExceptionまたはそれに基づくクラスは除きます)スロー可能、Errors。通常、JVM内部を超えて適切に処理されるように設計されたものではありません。

例外を非公開にすることもできますが、パッケージ全体ではなく、例外を定義するパッケージでのみ使用できます。

カスタム例外をスロー/キャッチする限り、組み込み例外と同じように動作します-throw via

throw new MyCustomException()

経由でキャッチ

catch (MyCustomException e) { }
4
Amber