gpt4 book ai didi

java - 为什么我们必须在 try-with-resource block 中声明和定义资源?

转载 作者:行者123 更新时间:2023-12-01 17:20:01 25 4
gpt4 key购买 nike

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 block ,以便在使用后关闭资源,因此它们无论如何都不应该可用(在您离开之后)您的 try block )。

所以这段代码

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 block ,而将其余的交给 JVM。另请参阅Oracle docs这个不得不说一下。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com