我有两个资源,它们在带有单独的 try catch block 的finally 子句中正确关闭。但是 Sonar 扫描仪提出了一个问题,即即使第二个流已关闭,也会将其关闭。
下面是示例片段。
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){}
}
这个规则有没有合适的解释?
最佳答案
您的资源管理对我来说似乎没问题 - 也许 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();
}
}
此外,您通常不想完全忽略异常:)
我说的是 gzos.write
周围的两个空的 catch
- finally
中的那些实际上没问题(或者至少,我会也写过)
关于java - 即使资源已关闭,sonar java 也会引发资源应关闭问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519759/