从我的角度来看,我使用try with resources,这样我就不必手动关闭try块中的资源。因此,在制作FileWriter
的情况下,我不必尝试,然后捕获并最终在中关闭它,但只需这样做:
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。