、複数種類の例外処理
catch (IOException ex) {
logger.log(ex);
throw ex;
catch (SQLException ex) {
logger.log(ex);
throw ex;
}
モディファイド
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
、キャプチャ上のコードを処理するときに例外をスローします。
static class FirstException extends Exception { }
static class SecondException extends Exception { }
public void rethrowException(String exceptionName) throws Exception {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e;
}
}
上記の例のtryブロックは、FirstExceptionとSecondExceptionのどちらかを投げることができます。jdk7では、メソッド宣言のthrowsで2つの例外型のいずれかを指定することはできません。catchの例外パラメータeはException型であり、catchブロックのrethrow例外eパラメータもException型であるため、メソッド宣言で宣言できるのは例外型がExceptionであることだけです。
public void rethrowException(String exceptionName)
throws FirstException, SecondException {
try {
// ...
}
catch (Exception e) {
throw e;
}
}
jdk7 のコンパイラは、例外をスローする宣言は try ブロックから行う必要があり、また、すべての例外は FirstException または SecondException である可能性のある try ブロックから行う必要があると判断できます。であるにもかかわらず、コンパイラはそれが FirstException または SecondException のどのインスタンスであるかを判断できます。
jdkコンパイラの検出ロジック:
jdk7 または jdk7 以降では、コンパイラは例外を再スローするロジックを検証します:
1, try ブロックが例外をスローできること;
2, 他の catch ブロックが事前に処理できないこと。
3, catch節の例外引数のサブタイプまたは親タイプであること。
注意
キャッチ・ブロックのパラメータ e に他の値が指定されている場合、コンパイラのこの解析機能は無効になります。メソッドの例外宣言では、Exception 型の例外しか使用できません。