![](/img/trans.png)
[英]why resources declared outside the try-with-resources statement need to be final or effectively final in java?
[英]Problem with: "Variable used as a try-with-resources resource should be final or effectively final"
从我的角度来看,我将try 与资源一起使用,因此我不必在try 块中手动关闭资源。 因此,在制作FileWriter
情况下,我不必尝试,然后在finally 中捕获并关闭它,但只需执行以下操作:
void m1(){
try(FileWriter fileWriter = new FileWriter ("test.txt")) {
//some operations
}catch (IOException ioException){
//some code
}
}
但是如果我有一个类引用已经实例化的FileWriter
呢? 然后我遇到了问题。 我想我在这个用例中有一个很大的“漏洞”。 有人可以指出我缺少什么吗? 我尝试这样做:
public class Test {
private FileWriter fileWriter;
public Test (FileWriter fileWriter) {
this.fileWriter = fileWriter;
}
public void m1 () {
try(fileWriter) { //compile error
//Says:Variable used as a try-with-resources resource should be final or effectively final
}catch (IOException ioe){
//some code
}
}
}
我唯一的目标是(“因为我很懒”)使用其引用自动关闭资源。 不幸的是,它并没有完全奏效。 如何更好地理解为什么我会收到引用警告?
如果您为 try 块的范围声明了一个新变量,则可以将 try 与资源一起用于在 try 块之外创建的任何资源。 将 m1 更改为:
public void m1 () {
try(var autoclosedhere = fileWriter) {
// or try(FileWriter autoclosedhere = fileWriter) {
// now fileWriter will close at the end
}catch (IOException ioe){
//some code
}
}
这适用于 Java 9 以后。 需要 try 子句中的局部变量,以便在块内更改fileWriter 时不会产生歧义 - 请参阅JDK-7196163 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.