当前位置: 首页 > 面试题库 >

Java资源管理:了解Findbugs结果

岳和泽
2023-03-14
问题内容

Findbugs使我迷惑了一个打开两个Closeable实例的方法,但是我不明白为什么。

资源

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分析

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);
}


 类似资料:
  • 问题内容: Jenkins是否可以管理一些资源?我的意思是说,只有一定数量的作业可以并行运行。例如,我的许可证服务器只能提供4个许可证,因此使用该许可证的每个作业应首先检查某个计数器是否大于零,然后再减少并在不再需要许可证后递减。有排除插件,但我认为它只能创建互斥(计数器等于1),不能创建信号量(计数器等于1或更大)。脚本中的简单变量不是解决方案,因为主机和所有从机必须可见同一计数器。有什么想法如

  • 我试图完全清理资源组在Azure。 删除资源组不是选项(访问权限:参与者,而不是所有者) 做到这一点的最优雅和明显的方法(也在一些文章中描述)是使用“空”部署模板执行完整的部署: 删除SQL Server开始“...”接受“...”失败“...”开始“...”接受“...”失败“... 你想到主意了。 其他时候效果很好。 您将得到数据库删除的无限循环“开始..接受..失败..开始..接受..失败.

  • 问题内容: Java程序员知道JVM运行垃圾回收器,而System.gc()只是建议JVM运行垃圾回收器。如果我们使用System.gc(),并不一定会立即运行GC。 如果我误解了Java的垃圾收集器,请纠正我。 除了依赖Java的Garbage Collector之外,还有其他方法可以进行内存管理吗? 如果您打算通过某种有助于管理内存的编程实践来回答问题,请这样做。 问题答案: 关于Java内存

  • 资源管理器 是我们用来访问和管理项目资源的工作区域。在开始制作游戏时,添加资源到这里通常是必须的步骤。您可以使用 HelloWorld 模板新建一个项目,就可以看到 资源管理器 中包含了一些基本资源类型。 界面介绍 资源管理器 将项目资源文件夹中的内容以树状结构展示出来,注意只有放在项目文件夹的 assets 目录下的资源才会显示在这里。关于项目文件夹结构说明请阅读 项目结构 一节。下面我们介绍各

  • 为了管理异构和不同配置的主机,为了便于Pod的运维管理,Kubernetes中提供了很多集群管理的配置和管理功能,通过namespace划分的空间,通过为node节点创建label和taint用于pod的调度等。

  • 资源管理器 面板是我们用来访问和管理项目资源的重要工具。 在开始制作游戏时,导入资源 通常是必须的步骤。您可以在新建项目时使用模板项目,新建步骤完成后会自动打开项目,默认布局中包含了 资源管理器 面板,里面有两个资源库,简称 DB,assets 和 internal, internal 属于默认的内置资源,内置资源可以复制出来,但不能直接修改。 面板操作预览 面板介绍 资源管理器 面板上主要有 头