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

Posted

技术标签:

【中文标题】问题:“用作资源尝试资源的变量应该是最终的或有效的最终”【英文标题】:Problem with: "Variable used as a try-with-resources resource should be final or effectively final" 【发布时间】:2020-11-04 07:23:01 【问题描述】:

从我的角度来看,我使用 try with resources,因此我不必在 try 块中手动关闭资源。因此,如果要创建FileWriter,我不必try,然后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
        
    
 

我唯一的目标是(“因为我很懒”)使用它的引用自动关闭资源。不幸的是,它并没有完全奏效。如何更好地理解为什么我会收到引用警告?

【问题讨论】:

【参考方案1】:

如果您为 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。

【讨论】:

很有趣,但如果我刚刚演示过,为什么它不起作用?我认为没有任何理由不允许这样做。为什么我们必须“欺骗”它并为同一资源使用新变量? 你可以在 try 块中更改 fileWriter,所以我猜try 中的变量声明表明了哪个版本的 fileWriter 的值是自动关闭的。

以上是关于问题:“用作资源尝试资源的变量应该是最终的或有效的最终”的主要内容,如果未能解决你的问题,请参考以下文章

SVM原问题与对偶问题

P问题,NP问题,NPC问题,NP-hard问题

P问题NP问题和NPC问题

网络流24题(好大的坑啊)

算法---- 01背包问题和完全背包问题LeetCode系列问题题解

算法---- 01背包问题和完全背包问题LeetCode系列问题题解