资源试用资源范围从 Java 9 发布后的 2017 年开始更新

2022-09-03 13:02:52

Java 7try-with-resources 构造中,我可以在语句中声明一个资源,当它超出范围时,它将自动关闭。try

但是,我没有找到任何可用资源范围的指示。具体来说,它在声明它的 try 块的 / 块中是否可用?catchfinally

我在Eclipse Kepler中尝试了以下内容,但它给人一种好坏参半的印象:

资源变量由内容助手(代码完成)提供

Content Assist suggests resource

Quick Fix 建议更改为资源变量,但这会以递归方式产生与它试图修复的相同的问题:

Redundant suggestion in Quick Fix

我想知道在Eclipse Bug Tracker中提出错误之前,正确的范围限制是什么。


答案 1

此语法称为扩展资源试用

根据JLS

try ResourceSpecification
    Block
Catchesopt
Finallyopt

将翻译为:

try {
    try ResourceSpecification
        Block
}
Catchesopt
Finallyopt

因此,在您的示例中,您的资源将限制为内部 try 块,因此不适用于外部 。try/catch/finally

编辑:

我的问题没有嵌套的尝试块

通过在代码中显式添加 catch/final 块,可以引入嵌套的 try 块。


答案 2

从 Java 9 发布后的 2017 年开始更新

现在,我们有更多的语法糖,我们可以在块之外声明一个资源,但仍然得到适当的处理。这就是为什么在Java 9中,Try-with-Resources得到了改进,引入了一种新的语法:Java 9try-catch

InputStream stream = new MyInputStream(...)
try (stream) {
   // do something with stream being sure that is going to be closed at the end
} catch(IOException e) {
   // you can surely use your resource here
}

请注意,对于 Java 版本 8 或次要版本,此语法将导致编译时错误

这是更“自然”的写作方式,即使在大多数用例中,我们不需要 try 块范围之外的资源。唯一的限制是读取器变量应有效地是最终的或只是最终的。

无论如何,使用此语法,您肯定可以在捕获中使用您的资源,并最终阻止