以下代码被FindBugs标记为错误。
FindBugs说“此方法可能无法清理(关闭,处置)流,数据库对象或需要显式清理操作的其他资源。”
该错误标在行output = new FileOutputStream (localFile);
但是我们已经在块中添加了try / finally。
inputStream input =null;
OutputStream output =null;
try {
input = zipFile.getInputStream(entry);
File localFile = new File(unzipFile.getAbsolutePath()
+ File.separator + entryName);
output = new FileOutputStream (localFile); // BUG MARKED HERE
byte[] buffer = new byte[1024 * 8];
int readLen = 0;
while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1) {
output.write(buffer, 0, readLen);
}
output.flush();
output.close();
input.close();
} finally {
if(output!=null) {
output.flush();
output.close();
}
if(input!=null) {
input.close();
}
}
答案 0 :(得分:6)
删除位于close()
块中的所有flush()
个来电(以及最后一次try
来电),因为如果出现错误,该代码将被取消。这就是警告的来源。在那里触发Findbugs相信你试图在try / catch块中处理它们。
同样在你的finally
中,最好包装另一个try catch块,以便你可以处理错误,如果output
关闭失败,你仍然可以继续关闭input
。
// your code here
output.write(buffer, 0, readLen);
// removed these since findbug complains about this
}
} finally {
// TODO some more try catching here so that if output closing
// fails you can still try to close second one and log the errors!
if(output!=null)
{
output.flush();
output.close();
}
if(input!=null)
{
input.close();
}
}
对于java 7及更高版本,还有更好的解决方案。请参阅http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html(感谢@ user2864740的链接)。