Javaでカスタム例外を作成するにはどうすればよいですか?
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.Exception
と Java.lang.Error
は、両方とも Throwable
のサブクラスです。サブクラス Throwable
がスローまたはキャッチされる可能性があります。ただし、 Error
をキャッチまたはスローすることは一般的に悪い習慣です。これは、プログラマが通常「処理」できないJVM内部のエラーを示すために使用されるためです(例 OutOfMemoryError
)。同様に、 Throwable
をキャッチすることを避ける必要があります。これは Error
sに加えて Exception
sをキャッチすることになります。
public class MyException extends Exception {
// special exception code goes here
}
次のように投げます:
throw new MyException ("Something happened")
キャッチ:
catch (MyException e)
{
// something
}
チェック済み例外の場合:
public class MyCustomException extends Exception { }
技術的には、Throwable
を拡張するものはすべてスローできますが、例外は一般にException
クラスの拡張であるため、他の一般的なタイプとは対照的に、例外をチェックします(RuntimeExceptionまたはそれに基づくクラスは除きます)スロー可能、Error
s。通常、JVM内部を超えて適切に処理されるように設計されたものではありません。
例外を非公開にすることもできますが、パッケージ全体ではなく、例外を定義するパッケージでのみ使用できます。
カスタム例外をスロー/キャッチする限り、組み込み例外と同じように動作します-throw via
throw new MyCustomException()
経由でキャッチ
catch (MyCustomException e) { }