当前位置: 首页 > 知识库问答 >
问题:

FindBugs-使用ObjectOutputStream时“可能无法关闭流”

濮阳景天
2023-03-14

我有一段代码,将Ojbect写入字节数组流:

     static byte[] toBytes(MyTokens tokens) throws IOException {
        ByteArrayOutputStream out = null;
        ObjectOutput s = null;
        try {
            out = new ByteArrayOutputStream();
            try {
                s = new ObjectOutputStream(out);
                s.writeObject(tokens);
            } finally {
                try {
                    s.close();
                } catch (Exception e) {
                    throw new CSBRuntimeException(e);
                }             
            }
        } catch (Exception e) {
            throw new CSBRuntimeException(e);
        } finally {
            IOUtils.closeQuietly(out);
        }
        return out.toByteArray();
    }

然而,FindBugs一直在抱怨line:

s = new ObjectOutputStream(out);

“可能无法关闭流”——糟糕的实践——开放流。有人能帮忙吗?

共有2个答案

郭永安
2023-03-14

这意味着s.close()将尝试关闭底层流,但可能无法完成。所以为了确保你也应该自己关闭它。试着把添加出来。关闭(),查看警告是否消失。

王棋
2023-03-14

我认为FindBugs不明白借据tils.close悄悄地关闭。

无论如何,关闭ObjectOutputStream就足够了,它将关闭底层ByteArrayOutputStream。这是ObjectOutputStream.close实现

public void close() throws IOException {
    flush();
    clear();
    bout.close();
}

所以你可以简化你的代码

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream s = new ObjectOutputStream(out);
    try {
        s.writeObject(1);
    } finally {
        IOUtils.closeQuietly(s);
    }

或者,如果您使用的是Java 7

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try (ObjectOutputStream s = new ObjectOutputStream(out)) {
        s.writeObject(1);
    }
 类似资料:
  • 我有一个错误不允许我继续,我只使用了一个接口,一个实现该接口的类和一个配置类,我使用了标记,但是bean没有被创建,这是我的接口 这是实现接口的类: 这是配置类 这是我测试它的主要地方 但是我得到了错误: 这些是我的包裹 有什么问题吗?

  • 我正在使用Spring JDBCTemboard访问数据库中的数据,它工作正常。但是FindBugs在我的代码片段中指出了一个小问题。 代码: FindBugs问题: 方法可能无法清理流或资源的检查异常在这一行 有人能告诉我这到底是什么吗?我们如何解决这个问题? 我们将不胜感激:)

  • 我使用Selenium在弹出消息窗口时收集数据,该窗口只是一个手册,所以我想将其关闭。我尝试了很多方法,比如:,,。。。或者根本不起作用。下面是该网站的html截图。 我感谢你的指导。 在此处输入图像描述

  • 我正在做一个实验2D物理的个人项目。现在,我正在尝试设置JFrame,以便它每秒更新60次。但是,当我调用方法开始更新JFrame时,我不能关闭JFrame。但是如果我省略了调用方法的部分,我可以关闭JFrame。这是主要代码: 这是Frame的代码: 如果我不在start()中调用updater(),我可以关闭JFrame。我知道我离开running=true,但它仍然应该关闭,因为这在我的旧计

  • 我有以下代码段: 然而,findbugs说有一种不好的做法: It:Iterator next()方法不能抛出NoSuchElementException(It\u NO\u SUCH\u元素),该类实现java。util。迭代器接口。然而,它的next()方法不能抛出java。util。无接触元素异常。应该更改next()方法,以便在没有更多元素可返回时调用它时抛出NoTouchElementE

  • 有谁知道什么时候可以使用Javhelp 3.17.0-GA吗? Javaassit中有一个bug(在3.17.0-GA中修复)在与Java 7一起使用时破坏了PowerMock:https://issues.jboss.org/browse/JASSIST-160?focusedCommentId=12718716 相关的PowerMock bughttp://code.google.com/p/