加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 7 Try-With-Resources(AutoCloseable)实现

发布时间:2020-12-15 04:09:29 所属栏目:Java 来源:网络整理
导读:我的问题更多的是为什么类型而不是如何. 我知道在Java 7中有以下工作: try ( FileInputStream in = new FileInputStream(source); FileOutputStream out = new FileOutputStream(target); ) { ..................... } catch (......) { ............... }
我的问题更多的是为什么类型而不是如何.

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

try (
            FileInputStream in = new FileInputStream(source);
            FileOutputStream out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }

以下是语法错误:

FileInputStream in;
    FileOutputStream out;
    try (
            in = new FileInputStream(source);
            out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }

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

解决方法

我没有这个语言设计决策的参考,但我认为问题是允许非局部变量自动闭合将是危险的 – 也就是说,它将允许许多不安全的编码样式.从 the Java Language Specification开始:

A resource declared in a ResourceSpecification is implicitly declared final (§4.12.4) if it is not explicitly declared final.

如果资源不是最终的,那么在try块中可能会重新分配它们,从而导致资源泄漏.由于它们(隐式或显式)是最终的,因此编译器必须做很多额外的工作以确保在输入try资源规范时变量是definitely unassigned.它可能还需要更改final的编译器语义,因为在try块退出后变量确实不应该有一个有效值;当然不是try资源规范中赋给它们的值.最干净(也许唯一)要做的是在try块退出时使变量超出范围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读