Java 资源管理:了解 Findbugs 结果

2023-12-07

Findbugs 给我带来了一个打开两个Closeable实例,但我不明白为什么。

Source

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 = ...

Question

谁错了:我还是 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块将导致try语句通过抛出该异常而终止,吞掉try块中抛出的任何异常,这通常是对于调试更有用。请参阅 duffymo 的答案,了解如何避免这种情况的简单方法。

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

try (
    FileReader fileReader = new FileReader(input); 
    FileWriter fileWriter = new FileWriter(output)
) {
    // may throw something
    sourceXmlToBeautifiedXml(fileReader, fileWriter);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 资源管理:了解 Findbugs 结果 的相关文章

随机推荐

  • 代表的目的[重复]

    这个问题在这里已经有答案了 复制 事件和委托的区别及其各自的应用 代表的优势是什么 我在哪里使用代表 我想知道代表们的目的是什么 我没怎么用过它们 也想不出什么东西 在我的课程中 写到委托是所有符合其签名的方法的蓝图 此外 您可以向一个委托
  • 以不同的名称循环保存图像

    我在循环保存裁剪后的图像时遇到问题 我的代码 def run self image file print image file cap cv2 VideoCapture image file while cap isOpened ret f
  • 模板化成员函数 typedef 无法编译

    include
  • Sagepay Forms 加密方法 经典 ASP

    我有一个使用 Classic ASP 开发的定制购物车 我需要将其与 SagePay Forms 集成 我正在努力寻找任何记录的 ASP 代码示例 说明如何加密发送到 Sagepay 的订单数据 做过这件事的人能给我指出正确的方向吗 有一些
  • MongoDB中如何对2个字段的总和进行排序

    我有这个文件 id 59b804e1ee8a4071a5ea3fcc description description imagepath https example com type label downvotes 25 upvotes 1
  • 为 git-diff 输出中的空白着色

    关于代码格式 我是纯粹主义者 我经常删除不必要的空格 仅包含 ws 的行 行尾的 ws 等 我什至将 vim 设置为显示那种红色的线条 我的问题是 使用 git diff 我经常看到这样的东西 else else 即使我有 git diff
  • 我可以将 mono64 与 Visual Studio for Mac 结合使用吗?

    我是 Mono 开发 但不是 NET 开发 的新手 下载了 Visual Studio for Mac 并尝试从 Alea GPU 运行示例解决方案 它抱怨它需要 mono64 但我没有看到像在 Windows 中那样选择 64 位架构的选
  • C语言中的空函数指针是什么意思?

    假设我们有一个函数指针 void func0 void 其还定义为 void func0 void printf 0 n 但是 假设在某些时候我们尝试以某种方式访问 函数指针 那么当我进入代码时 如果 MS VS 调试器显示 func0 实
  • 取消格式化磁盘大小字符串

    有什么方法可以转换字符串吗1K to 1000 1M to 1000000等等 用一个 Bash 命令 我想避免成为第 100 万第 30 个人为此创建超过 10 行或超过 100 个字符的单行 hack 就像是iso2int 5MB Ed
  • Hibernate使用Oracle序列时不生成标识符

    我有以下映射 Entity SequenceGenerator name sacpSequenceGenerator sequenceName SACP SEQ public class Sacp private Integer id Id
  • 使用类成员函数作为回调?

    我需要将一个成员函数传递给第三方外部方法 box self intersection d mycallback The box self intersection d是第三方外部静态方法 我无法修改它 mycallback是我想将其传递到的
  • 在 IE7 中垂直居中块

    我试图在 IE7 中垂直居中一个块 如果可能的话 也可以在 IE6 中 让我弄清楚一件事 我不是垂直居中实际元素 而是元素内的文本 这是我的 CSS 和 HTML 适用于 IE8 及以上版本 但不适用于以下版本 a display tabl
  • 仅当第一个非空 android 时才关注第二个编辑文本

    目前我有两个编辑文本 假设我想对空编辑文本检查进行验证 运行时验证的更好方法是什么 我的代码是 final EditText ev1 EditText findViewById R id editText1 final EditText e
  • MapFragment Google Maps API v2 内存不足错误/内存泄漏

    在过去的几天里 我读了很多类似的帖子 但没有一个专门回答这个问题 在使用混合地图进行大约 2 分钟的激进地图平移和缩放后 我开始遇到 OOM 问题 该应用程序似乎还在崩溃后保留了内存 因为在第一次失败后达到 OOM 所需的时间更少 我将代码
  • 单实例并在系统托盘中通知

    我正在开发该应用程序 C 2 0 我已经在其中实现了单个实例 一切安好 如果我再次运行该应用程序 它会显示消息框 提示 实例已在运行 实际上我不想通过消息框显示消息 我想使用已运行实例的气球提示来显示此消息 它在系统托盘中有通知图标 我怎样
  • 推断精确值打字稿

    如何让打字稿从传递的参数推断返回值 const toggle
  • 如何将带有awaitdata的可尾游标移动到末尾,以便我只获得新的更新

    我正在尝试使用 node js 驱动程序查看 MongoDB oplog 理论上它是有效的 但它的启动时间相当长 因为它似乎正在扫描整个集合 我在 MongoDB 文档中找到了这个 由于可尾游标不使用索引 因此查询的初始扫描可能会很昂贵 但
  • Firebase 云函数 - null user.displayName onCreate

    我正在尝试编写一个函数 在用户创建时发送欢迎电子邮件 我跟着去this教程 其中说可以访问新创建的用户displayName with user displayName 尽管它不断返回null为我 我意识到发生这种情况的可能原因 如果我错了
  • 内核栈和用户空间栈

    内核堆栈和用户堆栈有什么区别 为什么使用内核栈 如果在 ISR 中声明局部变量 它将存储在哪里 每个进程都有自己的内核堆栈吗 那么进程如何在这两个堆栈之间进行协调呢 内核堆栈和用户堆栈有什么区别 简而言之 除了使用内存中的不同位置 因此堆栈
  • Java 资源管理:了解 Findbugs 结果

    Findbugs 给我带来了一个打开两个Closeable实例 但我不明白为什么 Source public static void sourceXmlToBeautifiedXml File input File output throw