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

PM *_*7-1 3 java try-catch stream java-7

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

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

    try (
            FileInputStream in = new FileInputStream(source);
            FileOutputStream out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }
Run Code Online (Sandbox Code Playgroud)

以下是语法错误:

    FileInputStream in;
    FileOutputStream out;
    try (
            in = new FileInputStream(source);
            out = new FileOutputStream(target);
    ) {
        .....................
      } catch (......) {
       ...............
      }
Run Code Online (Sandbox Code Playgroud)

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

Ted*_*opp 7

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

如果未明确声明final,则在ResourceSpecification中声明的资源将被隐式声明为final(第4.12.4节).

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