问题:“用作资源尝试资源的变量应该是最终的或有效的最终”
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 的值是自动关闭的。以上是关于问题:“用作资源尝试资源的变量应该是最终的或有效的最终”的主要内容,如果未能解决你的问题,请参考以下文章