Java资源管理: understanding Findbugs results

标签 java resources findbugs

关于打开两个 Closeable 实例的方法,Findbugs 让我感到烦恼,但我不明白为什么。

来源

public static void sourceXmlToBeautifiedXml(File input, File output)
        throws TransformerException, IOException, JAXBException {

    FileReader fileReader = new FileReader(input);
    FileWriter fileWriter = new FileWriter(output);

    try {
        // may throw something
        sourceXmlToBeautifiedXml(fileReader, fileWriter);
    } finally {
        try {
            fileReader.close();
        } finally {
            fileWriter.close();
        }
    }
}

查找错误分析

Findbugs 告诉我

Method [...] may fail to clean up java.io.Reader [...]

并指向带有 FileReader fileReader = ...

的行

问题

谁错了:我还是 Findbugs?

最佳答案

FindBugs 是正确的:如果FileWriter 的构造函数抛出异常,文件读取器将不会关闭。要验证这一点,请尝试为 output 传递一个无效的文件名。

我会这样做:

    FileReader fileReader = new FileReader(input);

    try {
        FileWriter fileWriter = new FileWriter(output);
        try {
            // may throw something
            sourceXmlToBeautifiedXml(fileReader, fileWriter);
        } finally {
            fileWriter.close();
        }
    } finally {
        fileReader.close();
    }

请注意,关闭时抛出的异常的处理可以改进,因为通过抛出异常来离开 finally block 将导致 try 语句通过抛出该异常而终止,吞没 try block 中抛出的任何异常,这通常对调试更有用。有关如何避免这种情况的简单方法,请参阅 duffymo 的回答。

编辑:从 Java 7 开始,我们可以使用 try-with-resources 语句,它允许正确和简洁地处理这些极端情况:

try (
    FileReader fileReader = new FileReader(input); 
    FileWriter fileWriter = new FileWriter(output)
) {
    // may throw something
    sourceXmlToBeautifiedXml(fileReader, fileWriter);
}

关于Java资源管理: understanding Findbugs results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441853/

相关文章:

java - 准确计时函数运行所需的时间

java - 有没有办法在小程序/任何java应用程序中使用从Java EE中的tomcat服务器返回的信息?

将文件名转换为 URL() 后发生 Java IO FileNotFoundException

laravel 资源为每个项目问题传递多个参数

c++ - 如何从 Visual C++ 中的版本资源中读取

java - 可能无法清理 java.sql.ResultSet 、 Statement。清理资源的义务并未解除

java - Java 中的反序列化

java - 如何使加载的jar使用自身资源而不是加载器?

java - Findbugs & Ant - 停止特定违规的构建

java - Gradle:防止 Java 包结构中的循环依赖