我有两个资源在finally子句中使用单独的try catch块正确关闭。但是声纳扫描器会引发一个问题,即使它关闭也会关闭第二个流。
以下是示例代码段。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
BufferedReader reader = new BufferedReader(new FileReader("foo.in"));
GZIPOutputStream gzos = null;
try
{
gzos = new GZIPOutputStream(response.getOutputStream());
String line = null;
while ((line = reader.readLine()) != null) {
gzos.write(line.getBytes("UTF-8"));
}
gzos.flush();
} catch (Exception exp) {
} finally {
try {
if(reader != null) {
reader.close();
}
} catch (Exception exp) {}
try {
if(gzos != null) {
gzos.close();
}
} catch (Exception exp){}
}
} catch (Exception e){}
}
这条规则有没有正确的解释?
答案 0 :(得分:2)
您的资源管理对我来说似乎没问题 - 也许Sonarqube抱怨因为它无法遵循您的逻辑?
无论如何 - 如果你使用try-with-resources而忘记close()废话,你可能会更好:)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try ( BufferedReader reader = new BufferedReader(new FileReader("foo.in"));
GZIPOutputStream gzos = new GZIPOutputStream(response.getOutputStream()) ) {
String line; while ((line = reader.readLine()) != null) {
gzos.write(line.getBytes("UTF-8"));
}
gzos.flush();
}
}
另外,你通常不希望忽略异常:)
我在谈论catch
周围的两个空gzos.write
- finally
内的那些实际上是正常的(或者至少,我也会写它们)
答案 1 :(得分:0)
我使用SonarJava 5.0.1插件和devise
个人资料(包括Resources should be closed规则)扫描了您的代码。这个问题没有找到,所以你可能会发现已经修复的误报。