应该关闭资源即使资源被关闭,也会通过声纳java引发问题

时间:2018-01-30 10:58:12

标签: java sonarqube sonarqube-scan

我有两个资源在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){}
}

这条规则有没有正确的解释?

2 个答案:

答案 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规则)扫描了您的代码。这个问题没有找到,所以你可能会发现已经修复的误报。

Issues found in file