0

私はこの方法を持っています:

 private void unZipElementsTo(String inputZipFileName, String destPath) throws FileNotFoundException, IOException {

        OutputStream out = null;
        InputStream in = null;
        ZipFile zf = null;

        try {
            zf = new ZipFile(inputZipFileName);

            for (Enumeration<? extends ZipEntry> em = zf.entries(); em.hasMoreElements();) {
                ZipEntry entry = em.nextElement();
                String targetFile = destPath + FILE_SEPARATOR + entry.toString().replace("/", FILE_SEPARATOR);
                File temp = new File(targetFile);

                if (!temp.getParentFile().exists()) {
                    temp.getParentFile().mkdirs();
                }

                in = zf.getInputStream(entry);

                out = new FileOutputStream(targetFile);
                byte[] buf = new byte[4096];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                out.flush();
                out.close();
                in.close();
            }
        }
        finally
        {
            if (out!=null) out.close();
            if (zf!=null) zf.close();
            if (in!=null) in.close();
        }
    }

この方法では、ソナーは私にこの違反を与えます:

悪い習慣-メソッドは例外でストリームを閉じることができない可能性がありますunZipElementsTo(String、String)は例外でストリームを閉じることができない可能性があります

しかし、そこには違反は見られません。たぶん、それは単なる誤検知ですか?

4

4 に答える 4

8

それは正しい。OutputStream.close()メソッド自体が例外をスローする可能性があります。ブロックの 1 行目などでこれが発生した場合finally{}、他のストリームは開いたままになります。

于 2012-09-11T13:09:59.600 に答える
2

out.close()またはブロックzf.close()内で例外がスローされた場合finally、他のクローズは実行されません。

于 2012-09-11T13:10:00.240 に答える
0

ストリームのクローズ中に例外で例外をマスクしないようにするために、finally で io 例外を「隠す」ことが推奨されることがよくあります。

修正するには、最終的なクローズで org.apache.commons.io.IOUtils.closeQuietly(...) または guava Closeables.html#closeQuietly(java.io.Closeable) を使用します

例外処理の問題の詳細:
http://mestachs.wordpress.com/2012/10/10/through-the-eyes-of-sonar-exception-handling/

于 2013-01-29T08:46:31.363 に答える