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

2019-08-07 14:59发布

我有这样一段代码,这是一个写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);

认为“可能无法关闭流” - BAD_PRACTICE - OS_OPEN_STREAM。 谁能帮助?

Answer 1:

我认为FindBugs的不说已了解IOUtils.closeQuietly(出)关闭了。

反正它是足够关闭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);
    }


Answer 2:

这意味着, s.close()会尝试关闭底层流,但它可能无法做到这一点。 因此,可以肯定,你应该关闭它在自己还。 尝试添加out.close()看看是否警告消失。



文章来源: FindBugs - “may fail to close stream” when using ObjectOutputStream