我有這樣的方法:聲納違反:「法可能無法在異常關閉流」
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(字符串,字符串)關閉流可能無法在例外
關閉流,但是,我看不出有任何違規行爲存在。也許,這只是一個假陽性?
一個很好的做法是使用一個特殊的工具方法來默默地關閉流,即關閉或吞嚥異常,因爲你不能從反正這樣的異常中恢復: 公共靜態closeSilently(OutputStream的OS){ 嘗試{ os.close(); } catch(IOException ex ex){} } – wajda
流上關閉的IOException可能表示文件未寫入磁盤。讓它傳播比靜默地忽略它要安全得多。 – Vadzim