与其在中初始化资源,不如尝试使用资源阻止,如下所示:
try(FileWriter fw = new FileWriter ("java.txt")) {
//some operation
}catch (IOException ioe) {
ioe.printStackTrace ();
},我们现在只需传递一个对的引用,使用资源块,我们希望自动关闭它,如下所示:
FileWriter fw = new FileWriter ("java.txt");
try(fw) {
//some operation
}catch (IOException ioe){
ioe.printStackTrace ();
}到目前为止这部分已经很清楚了。我的问题是,为什么我将在下一个示例中显示的代码不起作用?它与上一个编译得很好的示例有什么不同?
public class Test {
private FileWriter fileWriter;
public Test (FileWriter fileWriter) throws IOException {
this.fileWriter = fileWriter;
}
{
try(fileWriter) { //compile error:
//"Variable used as a try-with-resources resource should be final or effectively final""
}catch (IOException ioe){
ioe.printStackTrace ();
}
}
}有人能帮我理解这条信息到底意味着什么吗?我不知道这里有什么问题。我还尝试将最终放在fileWriter变量声明中,这并没有解决问题。
发布于 2020-11-04 22:08:05
我得到以下编译器错误,与您的不匹配:
The blank final field fileWriter may not have been initialized这是因为您在实例初始化器中引用了fileWriter,它在超类构造函数调用和显式构造函数调用之后执行,但在构造函数中的任何剩余代码之前执行。根据JLS,第12.5节,“创建新类实例”
(粗体强调地雷)
这意味着构造函数尚未将任何东西分配给fileWriter,从而导致了实际的错误。
在初始化fileWriter之后,或者在构造函数中放置try-with块,或者将其移动到一个方法中。
发布于 2020-11-04 21:40:46
本质上,这意味着Java希望您确保传递来尝试使用--资源(在本例中是fileWriter)的变量在被分配后不会被更改。如果可以更改变量(例如在try块本身中),那么可能会出现各种未定义的行为。
从代码的角度来看,要完成这项工作,请在final的声明中添加fileWriter
public class Test {
private final FileWriter fileWriter; // add 'final'
public Test (FileWriter fileWriter) throws IOException {
this.fileWriter = fileWriter;
}
// ... in some other method
private void foo() {
try(fileWriter) {
} catch (IOException ioe){
ioe.printStackTrace ();
}
}
}https://stackoverflow.com/questions/64688022
复制相似问题