try-with-resources中的catch是否涵盖了括号中的代码?

时间:2017-04-20 14:35:20

标签: java try-with-resources

documentation不清楚catch之后的try-with-resources是否涵盖了初始化部分。

换句话说,给定此代码片段:

    try (InputStream in = getSomeStream()) {
        System.out.println(in.read());
    } catch (IOException e) {
        System.err.println("IOException: " + e.getMessage());
    }

如果catchIOException被抛出getSomeStream()会被调用吗?

catch仅覆盖花括号内的块,即System.out.println(in.read())

3 个答案:

答案 0 :(得分:5)

JLS开始,您的示例是一个扩展的try-with-resources。

  

带有至少一个catch子句和/或a的try-with-resources语句   finally子句称为扩展的try-with-resources语句。

在那种情况下:

  

翻译的效果是放置资源规范   "内部" try语句。 这允许扩展的catch子句   try-with-resources语句以捕获由于引起的异常   自动初始化或关闭任何资源。

所以,是的,catch阻止了该异常。

答案 1 :(得分:1)

是的,它已被覆盖。运行

try (InputStream in = getSomeStream()) {
  System.out.println(in.read());
} catch (IOException e) {
  System.err.println("IOException: " + e.getMessage());
}

static InputStream getSomeStream() throws IOException {
  throw new IOException();
}

打印

  

IOException:null

所以是的,初始化部分抛出的Exception被catch块捕获。

答案 2 :(得分:0)

Oracle教程具有权威性,但不具有规范性。 JLS http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3.2 完全回答你的问题:是的。

阅读精细手册。