微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

问题出现:“用作资源尝试资源的变量应该是最终的,或者实际上是最终的”

如何解决问题出现:“用作资源尝试资源的变量应该是最终的,或者实际上是最终的”

从我的角度来看,我对资源使用 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 举报,一经查实,本站将立刻删除。