繁体   English   中英

问题:“用作尝试资源资源的变量应该是最终的或有效的最终”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM