试用资源:我必须抛出或捕获 close() 方法的异常吗?

2022-08-31 20:57:45

如果这是错误的,请纠正我:在Java 7的try-with-resources语句中,资源方法引发的任何异常都必须声明为我的方法抛出,或者我必须将整个try包装在另一个尝试中,以捕获由 引发的任何异常。close()tryclose()

如果是这样,我不得不怀疑我是否会充分利用它。我当然不希望由 抛出异常,调用方将不知道该怎么办。而一个包装另一个只是为了处理,至少对我来说不会看起来很优雅。throwclose()trytryclose()

编辑:我想我不小心问了两个问题,其中一个是重复的。

问题1.我是否必须声明我的方法从该方法引发异常,或者将 try-with-resources 包装在另一次尝试中?(未以建议的副本回答。close()

问题2.有没有办法以静默方式关闭资源?(显然是重复的,所以我把这句话从问题中剔除。希望这使这个问题令人满意地独一无二。


答案 1

引用自 Java 语言规范 ($14.20.3.2)

14.20.3.2 扩展的资源试用

具有至少一个 catch 子句和/或 finally 子句的 try-with-resources 语句称为扩展的 try-with-resources 语句。扩展的资源试用语句的含义:

尝试资源指定

捕获选择
最终选择

通过以下对嵌套在 try-catch 或 try-finally 或 try-catch-finally 语句中的基本 try-with-resources 语句 (§14.20.3.1) 的转换给出

try {
try ResourceSpecification
Block
}
Catchesopt
finally opt

转换的效果是将 ResourceSpecification 放在 try 语句的“内部”。这允许扩展的资源试用语句的 catch 子句捕获由于任何资源的自动初始化或关闭而导致的异常。

所以,基本上,包装器已经实现


答案 2

Java 教程

使用资源进行 try 语句可以像普通的 try 语句一样具有 catch 和最终块。在 try-with-resources 语句中,任何 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().
}

推荐