已知非空值的冗余空值检查或 findbugs 中可能存在的错误

Ton*_*ony 5 java findbugs

这是代码:

public static String readFile(InputStream is) {

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

findbugs 插件说:

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

并指出这一点:

return scanner.hasNext() ? scanner.next() : "";
        } //this line contains bug!!!
    }
Run Code Online (Sandbox Code Playgroud)

看图:

在此处输入图片说明

eclipse 显示相同的警告:

在此处输入图片说明

joh*_*384 1

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

显然 FindBugs 似乎认为那里有问题。然而,几乎可以肯定事实并非如此。

覆盖工具也会发生同样的情况,即使该块已完全覆盖,但他们声称并非所有分支都被覆盖。这是因为 try-with-resources 块添加了对异常情况或资源为 null 的处理,而您无法通过单元测试等方式真正正确地覆盖这些情况。