已知非空值的冗余nullcheck或findbugs中的可能错误

时间:2017-01-12 20:29:30

标签: java findbugs

以下是代码:

public static String readFile(InputStream is) {

        try (Scanner scanner = new Scanner(is); Scanner delimitedScanner = scanner.useDelimiter("\\A");) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }

findbugs插件说:

  

已知为非null的值的冗余nullcheck此方法包含   冗余检查已知的非空值与常量nul

并指出:

return scanner.hasNext() ? scanner.next() : "";
        } //this line contains bug!!!
    }

看看图片:

enter image description here

eclipse也出现了同样的警告:

enter image description here

2 个答案:

答案 0 :(得分:1)

try-with-resources构造混淆了直接查看字节代码的代码分析器和覆盖工具。在try-with-resources块结束时,会生成许多额外的字节代码,这些代码将结束括号作为其行号。

显然,FindBugs似乎认为那里存在问题。但是,这几乎肯定不是这种情况。

覆盖工具也会发生同样的事情,即使该块被完全覆盖,他们声称并非所有分支都被覆盖。这是因为try-with-resources块增加了处理特殊情况或资源为null的处理,您无法通过例如单元测试来正确覆盖。

答案 1 :(得分:0)

问题在于JDK将try-with-resources重写为表单:

Scanner scanner = null
try {
   scanner = new Scanner(is);
} finally {
  if (null != scanner) {try {scanner.close();} catch (Exception e) {...}}
}

似乎已经修复了,所以请检查你的findbugs插件版本。 (https://sourceforge.net/p/findbugs/bugs/1169/