以下是代码:
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!!!
}
看看图片:
eclipse也出现了同样的警告:
答案 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/)