Javaでカスタム例外を作成するにはどうすればよいですか?
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
、プログラマ(たとえばOutOfMemoryError
)が「処理」できないJVM内部のエラーを示すために使用されるため、通常はキャッチまたはスローすることは悪い習慣です。同様にThrowable
、をキャッチすることは避けてください。これにより、Error
に加えてもキャッチされる可能性がありますException
。
チェック例外の場合:
public class MyCustomException extends Exception { }
技術Throwable
的には、拡張されたものはすべてスローされる可能性がありますが、例外は通常、Exception
クラスの拡張であるため、他の一般的なタイプのスロー可能オブジェクトとは異なり、チェックされた例外(RuntimeExceptionまたはそれに基づくクラスはチェックされません)です。Error
s通常は、JVM内部を超えて適切に処理されるように設計されたものではありません。
例外を非公開にすることもできますが、パッケージ全体ではなく、例外を定義するパッケージでのみ例外を使用できます。
カスタム例外のスロー/キャッチに関しては、組み込みの例外と同じように機能します。
throw new MyCustomException()
そして経由でキャッチ
catch (MyCustomException e) { }
Throwable
するものはすべてスローできます。例外は延長しException
ます。Throwableのカスタムサブクラスは、try { ... } catch (Exception e) { ... }
ブロックによってキャッチされません。
Error
はなく、エラーです)。3)これは、Exceptionのサブクラスがチェックされるのに対し、RuntimeExceptionはチェックされないことを意味します。Adamskiの答えははるかに正確です。