2013-04-09 70 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子句放置多个异常,或者你可以简单地捕获你想要的最外层异常。

相关问题