【问题标题】:Exceptions from both try block and try-with-resources来自 try 块和 try-with-resources 的异常
【发布时间】:2020-12-02 12:53:33
【问题描述】:

Documentation

然而,在这个例子中,如果readLineclose方法都抛出异常,那么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 语句尝试关闭 ZipFileBufferedWriter对象"

标签: java try-with-resources


【解决方案1】:

try-with-resources 语句和 try 块如何抛出异常?如果try-with-resources语句抛出异常,说明资源初始化失败。

try-with-resources 语句不仅初始化而且关闭资源,关闭可能抛出异常。

这句话紧跟在使用try-finally时的类似情况的描述之后,并将其与try-with-resources进行比较。

【讨论】:

  • 谢谢。我误解了文档所说的“try-with-resources”的范围。我假设它只是资源初始化,但它也包括资源关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2021-07-27
  • 2014-05-05
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多