2013-04-09 34 views
33

請糾正我,如果這是錯誤的:在Java 7的try-with-resources語句中,資源的close()方法拋出的任何異常必須聲明爲由我的方法拋出,或者我必須將整個try包含在另一個try中,由close()引發的異常。試用資源:我必須拋出或捕獲close()方法的異常嗎?

如果是這樣,我不得不懷疑我是否會利用它。我當然不想throwclose()拋出的異常,調用者將不知道該怎麼做。而一個try環繞另一個try只是爲了處理close()不會看起來很優雅,至少對我來說。

編輯:我想我不小心問了兩個問題,其中一個是重複的。

問題1.我是否必須聲明我的方法拋出了close()方法的異常,或者在另一個嘗試中包含try-with-resources? (沒有在建議的副本中回答)

問題2.有沒有一種方法可以靜靜地關閉資源? (顯然是重複的,所以我走的那句話出了問題。希望這使得問題的滿意是唯一的。)

+0

你有很多,從'close()方法'扔資源? – 2013-04-09 07:02:56

+0

只是少數,但我使用它們很多(ResultSet,BufferedReader,RandomAccessFile)。 – 2013-04-09 07:34:35

回答

26
Java Language Specification ($14.20.3.2)

報價:

14.20.3.2擴展的嘗試,與資源

一個試穿與資源聲明與至少一個catch子句和/或最終 子句稱爲擴展試用資源語句。 擴展的嘗試,與資源句話的意思:

       嘗試ResourceSpecification
               座
        漁獲選擇
        最後選擇

由以下翻譯給一個基本試-與資源嵌套在的try-catch聲明 (§14.20.3.1)或try-finallytry-catch-finally 聲明:

       嘗試{
               嘗試ResourceSpecification
                       座
       }
        漁獲選擇
        最後選擇

翻譯的效果是將ResourceSpecification「置於」「嘗試 」語句中。這允許擴展試用資源語句 的catch子句由於自動初始化或關閉任何資源而捕獲異常。

所以,基本上,包裝已經實現

18

the Java tutorial

一次嘗試與資源語句可以有漁獲物和finally塊就像一個普通的嘗試聲明一樣。在試用資源聲明中,任何catch或finally塊在聲明的資源已關閉後運行

(重點煤礦)

因此,你可以簡單地做

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
catch (IOException e) { 
    // handle the exception that has been thrown by readLine() OR by close(). 
} 
+0

將資源得到關閉,如果它不打電話catch並沒有最後阻止? – 2017-09-14 12:49:49

+0

點擊鏈接並閱讀。 – 2017-09-14 13:02:10

6

你不需要包裝在try-與資源在另一個try-catch塊,只需添加一個catch塊:

class Foo implements AutoCloseable { 
    public void close() throws Exception { 
     throw new Exception(); 
    } 
} 

public class Try { 
    public static void main(final String[] args) { 
     try(Foo f = new Foo()) { 
      System.out.println("No op!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

您應該可以簡單地添加相應的catch (Exception e) { }子句。如果您需要爲特定處理做特殊處理,或者您可以簡單地捕捉Exception,如果您需要它更廣泛。因爲它是Java 7,你可以爲每個catch子句放置多個異常,或者你可以簡單地捕獲你想要的最外層異常。

相關問題