通常当代码需要一些需要释放的资源时,我会看到它是这样完成的:
InputStream in = null;
try{
in = new FileInputStream("myfile.txt");
doSomethingWithStream(in);
}finally{
if(in != null){
in.close();
}
}
我不喜欢的是,您必须将变量初始化为 null,然后将其设置为另一个值,并在finally block 中通过检查资源是否为 null 来检查资源是否已初始化。如果不为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 是不安全的。这就是它不存在的原因。我接受了埃亚尔斯的回答,因为这正是我所寻找的。有一种方法可以在两个操作之间引发异常,这会使中间的示例不安全(使用 Thread.stop),但由于它是使用已弃用的调用进行的,并且无论您做什么都会让您陷入困境,所以我觉得使用中间的例子。
最佳答案
中间的样本是安全的 - 最后一个样本不安全。
try-finally block 意味着即使 doSomethingWithStream
抛出异常,流也会关闭。是的,您可以捕获所有异常,然后以这种方式关闭流 - 但让异常冒泡到调用者,但通过finally block 关闭流要简单得多。
关于java - 这是Java中释放资源的安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708229/