问题:"Variable used as a try-with-resources resource should be final or effectively final"
Problem with: "Variable used as a try-with-resources resource should be final or effectively final"
从我的角度来看,我使用 try with resources 所以我不必在 try 块 中手动关闭资源。所以在制作 FileWriter
的情况下,我不必 try,然后 catch 并在 中关闭它]最后,但只需这样做:
void m1(){
try(FileWriter fileWriter = new FileWriter ("test.txt")) {
//some operations
}catch (IOException ioException){
//some code
}
}
但是,如果我有一个引用已实例化的 FileWriter
的 class 怎么办?然后我遇到了问题。我认为我在这个用例中有一个很大的“漏洞”。有人可以指出我错过了什么吗?我试过这样做:
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 with resources。将 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 with resources 所以我不必在 try 块 中手动关闭资源。所以在制作 FileWriter
的情况下,我不必 try,然后 catch 并在 中关闭它]最后,但只需这样做:
void m1(){
try(FileWriter fileWriter = new FileWriter ("test.txt")) {
//some operations
}catch (IOException ioException){
//some code
}
}
但是,如果我有一个引用已实例化的 FileWriter
的 class 怎么办?然后我遇到了问题。我认为我在这个用例中有一个很大的“漏洞”。有人可以指出我错过了什么吗?我试过这样做:
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 with resources。将 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.