This question already has answers here:
Why is declaration required in Java's try-with-resource
                                
                                    (3个答案)
                                
                        
                6年前关闭。
            
        

try(PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));)
{}
catch(IOException ex)
{
  ex.printStackTrace();
}


以上工作正常。但是当我这样做

PrintWriter f;
try(f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));)
{}
catch(IOException ex)
{
  ex.printStackTrace();
}


它引发错误。为什么会这样呢?我正在测试此新功能,我认为我会采用第二种方法,并且在try-catch statement之后将打印资源PrintWriter f-如果try-with-resource语句按预期工作,则该参数应该为null。为什么不允许第二种方式?

另外我该如何通过方法1进行测试?

最佳答案

因为try-with-resources实际上为您添加了finally块以便在使用后关闭资源,所以它们无论如何都不能使用(在您离开try块之后)。

所以这段代码

try(PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));) {

} catch(IOException ex) {
    ex.printStackTrace();
}


实际上转化为

PrintWriter f = null;
try {
    f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));)
     // now do something
} catch(IOException ex) {
    ex.printStackTrace();
}
finally {
    try {
        f.close();
        catch(IOException ex) {}
     }
}


因此,这是最初的目的,将您从繁琐的代码中解放出来,让您只关心try块,而其余的则留在JVM上。另请参见Oracle docs关于此的内容。

关于java - 为什么我们必须在try-with-resource块中同时声明和定义资源? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19423758/

10-15 13:12