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

标签 java

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

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/

相关文章:

java - MOXy @XmlPath 注释无法多次读取相同的 XPath

java - 通过代码添加断点

java - JAXB 无法处理包含空格的 XML 元素到 java.net.URI 的映射

java - Android-从 DatePickerDialogFragment 中删除 Calendarview

java - 安装 ReporteRsjars 时无法加载 rJava.dll - 不是有效的 Win32 应用程序

java - 使用datastax java驱动程序异步写入cassandra的有效方法?

java - 在新线程中调用方法的简单方法

java - 如何在应用程序关闭后保存 arraylist<object>

java - 事务关闭语法与 hibernate 4 和 5 兼容

java - 为什么一个 println 语句会改变我的代码的整个输出?