3

我的问题更多是Why类型而不是How

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

4

1 回答 1

7

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

如果在 ResourceSpecification 中声明的资源未显式声明为 final,则它被隐式声明为 final(第 4.12.4 节)。

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

于 2013-04-22T04:05:27.170 回答