java - 即使资源已关闭,sonar java 也会引发资源应关闭问题

标签 java sonarqube sonarqube-scan

我有两个资源,它们在带有单独的 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/

相关文章:

unit-testing - 在运行 “maven clean install”和Sonar时,如何只运行一次单元测试?

sonarqube - 使用一个数据库运行两个 Sonar 实例

java - SonarQube 没有在 javadoc 中显示错误

java - 我需要有效地解密文件

java - 如何在android中的OpenWeatherMap api中更改描述语言

java - 排除 SonarQube 4.3 上的模块

jenkins - 从 Jenkins Pipeline 页面链接到 SonarQube

当许可是任何人时, Sonar 分析需要身份验证

运行 HelloWorld.java 时未找到 java.exe

java - Java 中的两个 JTree 相等/赋值