可以說創建語句拋出一個錯誤,現在會發生什麼? 被壓制了嗎?
不,它沒有被抑制,它被拋出,因爲它確實是根據Java規範的§14.20.3.1
你的代碼就相當於:
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();
}
}
}
所以你可以看到,如果createStatement()
拋出一個例外,如果沒有明確捕獲,調用代碼將不得不將這個異常作爲正常異常處理。
請注意,如果stmt.close()
在被try-with-resources
語句自動調用時拋出異常,則調用代碼將不得不處理此異常,因爲它也不會被抑制。
抑制異常的能力已被添加爲try-with-resources
聲明能夠得到同時呼籲資源close()
異常時已經在try
塊拋出已拋出的異常,例如:
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()
}