声纳违规:“方法可能无法在异常时关闭流"

2022-01-17 00:00:00 exception sonarqube java inputstream

我有这个方法:

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

对于这个方法,Sonar 给我这个违规:

For this method Sonar give me this Violation:

不好的做法 - 方法可能无法在异常时关闭流unZipElementsTo(String, String) 可能无法在异常时关闭流

Bad practice - Method may fail to close stream on exception unZipElementsTo(String, String) may fail to close stream on exception

但是,我没有看到任何违规行为.也许,它只是一个假阳性?

But, I don't see any violations there. Maybe, it is just a False-positive ?

推荐答案

没错.OutputStream.close() 方法本身可以抛出异常.如果发生这种情况,例如在 finally{} 块的第一行,其他流将保持打开状态.

That's right. The OutputStream.close() method can itself throw an exception. If this happens, e.g. on the 1st line of your finally{} block, then the other streams will be left open.

相关文章