首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java7尝试-With (AutoCloseable)实现

Java7尝试-With (AutoCloseable)实现
EN

Stack Overflow用户
提问于 2013-04-22 03:39:13
回答 1查看 3.2K关注 0票数 3

我的问题更多的是为什么类型,而不是如何。

我知道在Java 7中有以下工作:

代码语言:javascript
复制
    try (
            FileInputStream in = new FileInputStream(source);
            FileOutputStream out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }

下面给出一个语法错误:

代码语言:javascript
复制
    FileInputStream in;
    FileOutputStream out;
    try (
            in = new FileInputStream(source);
            out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }

我很好奇,为什么Closable/Autoclosable引用是本地try块的引用如此重要?这只是逻辑,如果我们不拥有它,那么关闭它是危险的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-22 04:05:27

我没有参考这个语言设计决策,但我认为问题是,允许非局部变量自动关闭将是危险的-也就是说,它将允许许多不安全的编码风格。来自Java语言规范

在ResourceSpecification中声明的资源如果没有显式声明为final,则被隐式声明为final (§4.12.4)。

如果资源不是final,那么在try块内可能会重新分配它们,从而导致资源泄漏。因为它们是(隐式的或显式的) final,所以编译器必须做大量额外的工作来确保变量在输入try资源规范时是绝对没有分配。它还可能需要修改final的编译器语义,因为在try块退出之后,变量实际上不应该有一个有效值;当然不是在try资源规范中分配给它们的值。当try块退出时,最干净(也许只是)的事情就是使变量超出作用域。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16139051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档