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

时间:2013-04-22 03:39:14

标签: java stream try-catch java-7

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

我知道在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块的本地如此重要?如果我们不拥有它而不是关闭是危险的,那只是的逻辑吗?

1 个答案:

答案 0 :(得分:7)

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

  

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

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