Java FindBugs-“搜索引擎”;可能无法关闭流”;使用ObjectOutputStream时

Java FindBugs-“搜索引擎”;可能无法关闭流”;使用ObjectOutputStream时,java,stream,findbugs,software-quality,Java,Stream,Findbugs,Software Quality,我有一段代码,将Ojbect写入字节数组流: static byte[] toBytes(MyTokens tokens) throws IOException { ByteArrayOutputStream out = null; ObjectOutput s = null; try { out = new ByteArrayOutputStream(); try {

我有一段代码,将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一直在抱怨线路:

s = new ObjectOutputStream(out);

“可能无法关闭流”-错误的做法-操作系统打开流。有人能帮忙吗?

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

我认为FindBugs并不否认IOUtils.closequilly(out)关闭

无论如何,关闭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);
    }
或者如果您使用的是Java7

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

当然FindBugs会突出显示
out=newbytearrayoutputstream()行?突出显示行
s=newobjectoutputstream(out)out.close()
。这只是一个警告,它可能导致错误。如果该行不存在,他将看不到任何警告。如果您使用的是Java 7,您可以使用。不幸的是,我一直使用Java 6仅供参考-我无法让我的FindBugs抱怨您的代码。我使用的是最新的FindBugs Eclipse,报告级别设置为20(最不重要),并且启用了每个类别。您正在使用哪个版本的FindBugs以及如何执行它?我正在使用Eclipse3.7和Maven,因此使用了FindBugs-Maven插件:2.5.2。使用“mvn站点”运行它来报告错误。我已经尝试过了,但是IOUtils.closequirey()不能与ObjectOutput一起工作,所以它无法关闭“s”。仅允许OutputStream…请重试。它起作用了。ObjectOutputStream扩展了OutputStream,所以它是OutputStream我不这么认为:“找不到符号符号:方法关闭(java.io.ObjectOutput)位置:class org.apache.commons.io.IOUtils”可能“s”被定义为导致此权利的ObjectOutput类型,直接使用ObjectOutputStream,ObjectOutput是一个接口