【发布时间】:2020-12-02 12:53:33
【问题描述】:
然而,在这个例子中,如果
readLine和close方法都抛出异常,那么readFirstLineFromFileWithFinallyBlock方法抛出从finally块抛出的异常;从try块抛出的异常被抑制。相反,在示例readFirstLineFromFile中,如果try块和try-with-resources 语句都抛出异常,则方法readFirstLineFromFile会抛出从try块;从try-with-resources 块抛出的异常被抑制。在 Java SE 7 及更高版本中,您可以检索被抑制的异常;有关详细信息,请参阅抑制的异常部分。
粗体部分看不懂
... 如果
try块和try-with-resources 语句都抛出异常 ...
try-with-resources 语句和try 块如何引发异常?如果从try-with-resources 语句中抛出异常,则表示资源初始化失败。在这种情况下,try 块永远不会执行。因此前面的语句不可能发生。
我一定误解了 documentation 以及 try-with-resources 的工作原理。你能举出粗体陈述实际发生的例子吗?
提到的方法
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
【问题讨论】:
-
close部分也可能引发异常。因此,如果 try 块抛出异常,try-with-resources 将尝试关闭文件句柄,并且如果 also 抛出异常,那么这将涵盖它们都抛出异常的情况。来自同一页面:“在示例 writeToFileZipFileContents 中,可以从 try 块中引发异常,当 try-with-resources 语句尝试关闭ZipFile和BufferedWriter对象"