我的问题更多是为什么类型而不是如何。
我知道在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
块的本地如此重要?如果我们不拥有它而不是关闭是危险的,那只是的逻辑吗?
答案 0 :(得分:7)
我没有这个语言设计决策的参考,但我认为问题是允许非局部变量自动封闭将是危险的 - 也就是说,它将允许许多不安全的编码风格。来自the Java Language Specification:
如果未明确声明为final,则在ResourceSpecification中声明的资源将被隐式声明为final(§4.12.4)。
如果资源不是final
,那么在try
块内可能会重新分配它们,从而导致资源泄漏。由于它们(隐式或显式地)final
,编译器必须做很多额外的工作,以确保在输入try
资源规范时变量为definitely unassigned。它可能还需要更改final
的编译器语义,因为在try
块退出后变量确实不应该具有有效值;当然不是try
资源规范中赋给它们的值。最干净(也许唯一)要做的是在try
块退出时使变量超出范围。