【问题标题】:sonar java 3.9 false positive resource is not closed (squid:S2095)声纳 java 3.9 误报资源未关闭 (squid:S2095)
【发布时间】:2016-02-05 23:33:52
【问题描述】:

以下代码导致输入流读取器未关闭的误报。如果 BufferedReader 关闭,则输入​​流阅读器会自动关闭。我知道这可以通过使用 java 7+ 的资源尝试更优雅地解决,但这是 android 代码的一部分,所以我们坚持使用这个解决方案。顺便提一句。规则中的示例代码建议执行 reader.close(不使用 try catch),因为它会引发 IOException。

    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(…));
        // …
    } catch (IOException e) {
        // …
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            // …
        }
    }

【问题讨论】:

  • 请不要将此作为针对 SonarSource 团队的问题进行编辑。如果您想做这样的事情,请联系 google 群组:sonarqube@google-groups.com 我们会监控此 sonarqube 标签,但 SO 不是用于此目的的网站,而是用于提问的网站。
  • 亲爱的苯佐尼科。好的会做!
  • 错误的电子邮件让我更正:sonarqube@googlegroups.com

标签: sonarqube


【解决方案1】:

我想重点在于“new InputStreamReader(...)”,“...”可能包含必须关闭的资源定义。 看https://www.securecoding.cert.org/confluence/display/java/FIO04-J.+Release+resources+when+they+are+no+longer+needed

【讨论】:

  • 它的阅读器 = new BufferedReader(new InputStreamReader(context.getAssets().open(FILE)));
【解决方案2】:

在你的情况下,我理解声纳警告,在我的情况下不是:

 BufferedWriter csvFile = null;
 FileOutputStream fos = null;
 OutputStreamWriter os = null;
 try {
            fos = new FileOutputStream(fileName); // here false SONAR warning
            os = new OutputStreamWriter(fos, "UTF-8");
            csvFile = new BufferedWriter(os);
 } finally {
            if (csvFile != null) { //NOSONAR
                csvFile.close();
            }

            if (os != null) { //NOSONAR
                os.close();
            }

            if (fos != null) { //NOSONAR
                fos.close();
            }

     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2019-07-05
    • 2012-02-09
    • 2011-03-03
    • 2016-06-21
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多