如何解决问题出现:“用作资源尝试资源的变量应该是最终的,或者实际上是最终的”
从我的角度来看,我对资源使用 try ,因此不必在 try块中手动关闭资源。因此,在制作FileWriter
的情况下,我不必尝试,然后 catch 并在 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 with resources用于在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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。