FindBugs - “may fail to close stream” when using ObjectOutputStream

我与影子孤独终老i 提交于 2019-12-05 22:51:26

问题


I have this piece of code, which is to write an Ojbect to a byte array stream:

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

However, FindBugs keeps complaining about line:

s = new ObjectOutputStream(out);

that "may fail to close stream" - BAD_PRACTICE - OS_OPEN_STREAM. Can somebody help?


回答1:


I think FindBugs does not undestand that IOUtils.closeQuietly(out) closes out.

Anyway it is enough to close ObjectOutputStream and it will close underlying ByteArrayOutputStream. This is ObjectOutputStream.close implementation

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

so you can simplify your code

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

or if you are in Java 7

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



回答2:


It means that s.close() will try to close underlying stream, but it may fail to do it. So to be sure you should close it on your own also. Try to add out.close() and see if warning disappears.



来源:https://stackoverflow.com/questions/14434323/findbugs-may-fail-to-close-stream-when-using-objectoutputstream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!