gpt4 book ai didi

java - 这是在 Java 中释放资源的安全方式吗?

转载 作者:行者123 更新时间:2023-11-29 06:21:51 25 4
gpt4 key购买 nike

通常当代码需要一些需要释放的资源时,我看到它是这样完成的:

InputStream in = null;
try{
in = new FileInputStream("myfile.txt");
doSomethingWithStream(in);
}finally{
if(in != null){
in.close();
}
}

我不喜欢的是您必须将变量初始化为 null,然后将其设置为另一个值,并在 finally block 中通过检查资源是否为 null 来检查资源是否已初始化。如果不为空,则需要释放。我知道我在挑剔,但我觉得这可以做得更干净。

我想做的是:

InputStream in = new FileInputStream("myfile.txt");
try{
doSomethingWithStream(in);
}finally{
in.close();
}

在我看来,这看起来几乎和前一个一样安全。如果资源初始化失败并抛出异常,则无需执行任何操作(因为我没有获得资源),因此它不必位于 try block 内。我唯一担心的是,是否有某种方式(我没有获得 Java 认证)可以在操作之间抛出异常或错误?

更简单的例子:

Inputstream in = new FileInputStream("myfile.txt");
in.close();

有没有什么方法可以让流保持打开状态而 try-finally block 会阻止?

编辑:

也许我应该省略最后一个例子,因为它会让每个人感到困惑。这不应该是初学者级别的问题。我知道 try-finally 做了什么,我知道如果在最后一个例子中间有 doSomethingWithStream 是不安全的。这就是它不存在的原因。我接受了 Eyals 的回答,因为这正是我要找的。有一种方法可以在两个操作之间引起异常,这会使中间的示例不安全(使用 Thread.stop),但由于它是使用已弃用的调用制作的,并且无论您做什么都会让您感到困惑,所以我觉得使用中间的例子。

最佳答案

中间的样本是安全的 - 最后一个不是。

try-finally block 意味着即使 doSomethingWithStream 抛出异常,流也会关闭。是的,您可以捕获所有异常,然后以这种方式关闭流 - 但是让异常冒泡到调用者,但在途中通过 finally block 关闭流要简单得多。

关于java - 这是在 Java 中释放资源的安全方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708229/

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