我的问题更多的是为什么类型,而不是如何。
我知道在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块的引用如此重要?这只是逻辑,如果我们不拥有它,那么关闭它是危险的
发布于 2013-04-22 04:05:27
我没有参考这个语言设计决策,但我认为问题是,允许非局部变量自动关闭将是危险的-也就是说,它将允许许多不安全的编码风格。来自Java语言规范
在ResourceSpecification中声明的资源如果没有显式声明为final,则被隐式声明为final (§4.12.4)。
如果资源不是final,那么在try块内可能会重新分配它们,从而导致资源泄漏。因为它们是(隐式的或显式的) final,所以编译器必须做大量额外的工作来确保变量在输入try资源规范时是绝对没有分配。它还可能需要修改final的编译器语义,因为在try块退出之后,变量实际上不应该有一个有效值;当然不是在try资源规范中分配给它们的值。当try块退出时,最干净(也许只是)的事情就是使变量超出作用域。
https://stackoverflow.com/questions/16139051
复制相似问题