ステートメントを作成するとエラーが発生しましたが、今はどうなりますか?それは が抑制されていますか? createStatement()
をスローした場合にあなたが見ることができるように
Throwable primaryExc = null;
Statement stmt = null;
try {
stmt = con.createStatement();
// use stmt here
} catch (Throwable e) {
primaryExc = e;
throw e;
} finally {
if (stmt != null) {
if (primaryExc != null) {
try {
stmt.close();
} catch (Throwable ex) {
primaryExc.addSuppressed(ex);
}
} else {
stmt.close();
}
}
}
:それは抑制されていないん
、それは確かに、それがあるとしてスローされるのJava仕様の§14.20.3.1
に応じて、あなたのコードは同等です例外、明示的に捕捉されない場合、呼び出し側コードは通常の例外としてこの例外を処理する必要があります。
stmt.close()
がtry-with-resources
ステートメントで自動的に呼び出されている間に例外をスローした場合、上記の同等のコードスニペットと同様に、呼び出しコードはこの例外も処理されないため、この例外を処理する必要があります。
:
例外を抑制する能力は、例えば、例外がすでにtry
ブロックでスローされたとき、リソースのclose()
を呼び出し中にスローされていた例外を取得することができるようにtry-with-resources
文に追加されました
try (Statement stmt = con.createStatement()) {
throw new RuntimeException("foo");
} catch (Exception e) {
// Here e is my RuntimeException, if stmt.close() failed
// I can get the related exception from e.getSuppressed()
}