当前位置: 首页 > 知识库问答 >
问题:

为什么try-with-resource需要一个局部变量?

贺正祥
2023-03-14

关于我的问题java.util.concurrent.locks.lock的可自动关闭包装中的任何风险,我想知道为什么try-with-resource-语句需要一个命名的局部变量。

我目前的使用情况如下:

try (AutoCloseableReentrantReadWiteLock.Lock l = _lock.writeLock()) {
    // do something
}        

变量L在try块内未使用,只会污染名称空间。据我所知,类似的C#using-语句不需要本地命名变量。

在try块结束时关闭的匿名局部变量不能支持以下操作,有什么原因吗?

try (_lock.writeLock()) {
    // do something
}        

共有1个答案

陶宜民
2023-03-14

@McDowell评论中的链接揭示了Joe Darcy的一篇博文评论中的正确答案,Joe Darcy领导了引入try-with-resources语句的Java技术规范:

在JDK7中,我们从try-with-resources构造开始,该构造允许对资源使用通用表达式,包括方法调用。然而,专家组通过早期草案审查(http://jcp.org/aboutjava/communityprocess/edr/jsr334/index.html)发现

“[对try-with-resources statemenbt的一个可能的未来更改]是放弃对将资源指定为通用表达式的支持。允许将通用表达式用作资源会产生非常复杂的规范和实现。可以是标识符或PrimaryNoNewArray的受限表达式可能就足够了。即使是只允许标识符的更严格的限制也可以提供几乎所有允许完整表达式的附加效用(而不是强制声明新资源变量),但对实现和规范的边际影响要低得多。”

到JDK7结束时,我们想要的是一个新的资源变量声明或一个现有的final/实际上是final变量。我们只有时间提供前者在7;在9中,我们也提供了后者。

 类似资料:
  • 问题内容: Java7的try-with-resources非常好,但是我无法绕开为什么需要在语句中包括资源声明的问题。我的直觉说以下应该是可能的: las,这会导致语法错误(含糊地期待a )。将类型定义/声明移动到语句中是可行的,这当然会将事物移动到相应的范围内。当我想从封闭中获得更多收益时,我可以弄清楚该如何解决,我对 为什么 编译器需要这样的东西很感兴趣。 问题答案: 您的版本未明确定义应关

  • 本文向大家介绍什么是Java中的try-with-resource?,包括了什么是Java中的try-with-resource?的使用技巧和注意事项,需要的朋友参考一下 每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。 从JSE7开始,引入了try-with-resources语句。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在

  • 如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?

  • print语句会导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经有一个默认值(float=0.0f),为什么我需要定义一个呢? 所以,这是有效的 谢谢大家!

  • 假设我使用的是一个文档不完整的第三方库,它没有源代码。库的方法之一接受来加载各种数据。 不幸的是,Java规范(据我所知)没有提到如果在try-with-resource中手动关闭资源会发生什么。有没有人碰巧知道?

  • 下面的示例类无法编译: 此代码的编译错误消息是: 但是,对于包含以下方法的类,Java不会生成任何错误消息: 关于初始化及其要求,为什么Java对最终实例变量和最终局部变量的处理不同?谢谢