簡體   English   中英

什么時候拋出“ throws Exception”?

[英]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塊。

您可以創建一個實用程序方法來關閉資源,然后使用資源調用該方法。 由於AutoCloseableConnectionStatementResultSet超級接口,因此可以定義如下的實用方法

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
}

並且在任何情況下自動關閉(如果您的有用代碼拋出了異常或沒有拋出異常),則所有異常均得到處理,並且塊保持一致狀態。 唯一的問題是所有類( Type1Type2Connection )都必須實現Autocloseable接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM