Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7资源试用(自动关闭)实现_Java_Stream_Try Catch_Java 7 - Fatal编程技术网

Java 7资源试用(自动关闭)实现

Java 7资源试用(自动关闭)实现,java,stream,try-catch,java-7,Java,Stream,Try Catch,Java 7,我的问题更多的是为什么而不是如何 我知道,在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
块的local如此重要?如果我们不拥有它,那么关闭它是危险的,这只是逻辑吗

我没有这一语言设计决策的参考资料,但我认为问题在于允许非局部变量自动关闭是危险的,也就是说,它会允许许多不安全的编码样式。发件人:

如果资源规范中声明的资源未明确声明为最终资源,则该资源隐式声明为最终资源(§4.12.4)


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

我的似乎是重复的。因此,这个问题已经被提出,但我认为还没有得到回答。