[英]When is “throws Exception” thrown?
假設具有以下功能:
public void close() throws SQLException {
if (rs != null) { rs.close(); }
if (ps != null) { ps.close(); }
if (connection != null){ connection.close(); }
}
如果我嘗試關閉rs並失敗,我的其余代碼是否仍被執行(即異常是否在結尾處拋出),還是立即中斷了該函數(從而防止ps和連接正確關閉) 。
如果該異常發生在rs.close
,則拋出該異常。 如果要執行其他語句,則需要使用finally
。 如果您懷疑會拋出另一個異常,則可以創建一個函數如closeQuietly
,該函數將確認但如果您認為可以安全地忽略它們, closeQuietly
其丟棄。 例如(根據此答案 ),
protected void closeQuietly( Resource resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during Resource.close()", ex );
}
}
當rs.close()
引發異常時,其余行將不執行。 捕獲的異常將傳播。
如果您希望其他語句不被其他語句打擾,請為每個關閉使用單獨的try / catch塊。
您可以創建一個實用程序方法來關閉資源,然后使用資源調用該方法。 由於AutoCloseable
是Connection
, Statement
, ResultSet
超級接口,因此可以定義如下的實用方法
public static void closeQuietly(AutoCloseable resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during closing the resources", ex );
}
}
您需要將要執行的行放在finally語句中,finally語句將執行您想要的操作,然后引發異常。 您還可以檢查自動關閉界面
如果第一條指令調用了異常,則程序的其余部分將不再執行。 為了解決該finally
-塊被引入到異常處理。 您可以在那里釋放任何資源。
這正是Java 7 try-with-resources新功能的作用所在!
您只需以這種方式使用它:
try (
final Type1 rs = ...;
final Type2 ps = ...;
final Connection connection = ...
) {
...
... // usefull code here
...
}
catch (...) {
// exception handling
}
並且在任何情況下都自動關閉(如果您的有用代碼拋出了異常或沒有拋出異常),則所有異常均得到處理,並且塊保持一致狀態。 唯一的問題是所有類( Type1
, Type2
, Connection
)都必須實現Autocloseable
接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.