当前位置: 首页 > 面试题库 >

为什么在Java的try-with-resource中需要声明

桑睿识
2023-03-14
问题内容

Java7的try-with-resources非常好,但是我无法绕开为什么需要在try语句中包括资源声明的问题。我的直觉说以下应该是可能的:

CloseableResource thing;
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) {
    // do some interesting things
}
thing.collectSomeStats();

las,这会导致语法错误(含糊地期待a
;)。将类型定义/声明移动到try语句中是可行的,这当然会将事物移动到相应的范围内。当我想从AutoClosable封闭中获得更多收益时,我可以弄清楚该如何解决,我对
为什么 编译器需要这样的东西很感兴趣。


问题答案:

您的版本未明确定义应关闭的内容,例如

CloseableResource thing;
Parameter a;

try (a = (thing = methodThatCreatesAThingAndDoesSomeSideEffect()).getParameter()) {

还要写的话怎么办

try (12) {

或者其他的东西?

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();
CloseableResource thing2 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

为什么只关闭thing1

因此,当前语法迫使您在打开关闭块的同时创建变量。

ALSO2

CloseableResource Thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

thing1.doSomethingOnClosedResource();

由于thing1仍然存在。



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

  • 关于我的问题java.util.concurrent.locks.lock的可自动关闭包装中的任何风险,我想知道为什么try-with-resource-语句需要一个命名的局部变量。 我目前的使用情况如下: 变量在try块内未使用,只会污染名称空间。据我所知,类似的C#-语句不需要本地命名变量。 在try块结束时关闭的匿名局部变量不能支持以下操作,有什么原因吗?

  • 下面的try with resources语句是来自Java文档的示例 根据文件, 用资源尝试语句确保每个资源在语句末尾关闭。 我的问题是,为什么我需要在try关键字之后立即在括号内声明资源。(如上面的BuffereReader) BufferReader实现了java。lang.AutoCloseable 所以为什么不支持这样的事情, 一旦退出尝试,就隐式关闭资源对象。(正如它所实现的自动关闭)

  • 问题内容: 每个循环的通常形式是: 但是,如果我想在循环之后一直保留bar,则 不能 为每个循环使用: for循环获取上述语法错误。 为什么是这样? 我对变通办法不感兴趣,但只是对这种限制背后的考虑感到好奇。 相反,使用普通的for循环,变量可以在外部声明或根本不声明。 问题答案: 这是一个很好的问题,我很乐意看到一些深入的答案。但是,官方文档说: 这些缺点为设计师所知,他们明智地决定采用一种干净

  • 问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。

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