Java 7资源试用(自动关闭)实现
我的问题更多的是为什么而不是如何 我知道,在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 (......) { ...
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
块退出时,要做的最干净(也许是唯一)的事情是使变量超出范围。我的似乎是重复的。因此,这个问题已经被提出,但我认为还没有得到回答。