This question already has answers here:
Why is declaration required in Java's try-with-resource
(3个答案)
6年前关闭。
以上工作正常。但是当我这样做
它引发错误。为什么会这样呢?我正在测试此新功能,我认为我会采用第二种方法,并且在
另外我该如何通过方法1进行测试?
实际上转化为
因此,这是最初的目的,将您从繁琐的代码中解放出来,让您只关心
(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