documentation不清楚catch
之后的try-with-resources
是否涵盖了初始化部分。
换句话说,给定此代码片段:
try (InputStream in = getSomeStream()) {
System.out.println(in.read());
} catch (IOException e) {
System.err.println("IOException: " + e.getMessage());
}
如果catch
内IOException
被抛出getSomeStream()会被调用吗?
或catch
仅覆盖花括号内的块,即System.out.println(in.read())
?
答案 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 完全回答你的问题:是的。
阅读精细手册。