Java でカスタム例外を作成するにはどうすればよいでしょうか?
ベストアンサー1
定義するにはチェック済み例外として、サブクラス(またはサブクラスの階層)を作成します。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
これは、通常プログラマが「処理」できないJVM内部のエラーを示すために使用されます(例:OutOfMemoryError
同様に、Throwable
、その結果、Error
に加えてException
s。