8

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. 誰か助けてくれませんか?

4

2 に答える 2

8

FindBugs は IOUtils.closeQuietly(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);
    }

またはJava 7を使用している場合

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try (ObjectOutputStream s = new ObjectOutputStream(out)) {
        s.writeObject(1);
    }
于 2013-01-21T07:58:00.183 に答える
1

これは、s.close()基になるストリームを閉じようとすることを意味しますが、失敗する可能性があります。したがって、必ず自分で閉じる必要があります。追加out.close()して、警告が消えるかどうかを確認してください。

于 2013-01-21T07:54:03.133 に答える