9

当我在此代码上运行 FindBugs 时,它不会报告任何问题。

boolean _closed = false;

public void m1(@Nullable String text) {
    if(_closed)
        return;

    System.out.println(text.toLowerCase());
}

虽然在这里它发现了预期的问题:

public void m1(@Nullable String text) {
    System.out.println(text.toLowerCase());  // FindBugs: text must be nonnull but is marked as nullable
}

为什么在第一种情况下会失败?

4

6 回答 6

1

我拿了 FindBugs 的资源并搜索了

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

找到两个文件:

  1. BuildUnconditionalParamDerefDatabase.java
  2. 不一致的注解.java

两者都只考虑“无条件参数取消引用”。

看起来 FindBugs 对于查找空指针问题并不是那么有用:-(

附言

public void m1(@CheckForNull String text) {
    if(_closed) // FindBugs: text must be nonnull but is marked as nullable
        System.out.println(text.toUpperCase());
    else
        System.out.println(text.toLowerCase());
}
于 2010-05-08T14:19:52.147 回答
1

我同意alex2k8。这可能是因为 _closed 数据成员。只要它没有被声明为final,它的初始化就无关紧要。静态分析没有通用方法来确定运行时 _close 的实际值,也没有软件可以做到这一点(它相当于停机问题)。

于 2010-05-07T23:00:22.220 回答
0

edu.umd.cs.findbugs.annotations.Nullable [目标] 字段、方法、参数

在某些情况下,带注释的元素可能为空。一般来说,这意味着开发人员必须阅读文档以确定何时可以接受空值以及是否需要检查空值。FindBugs 会将带注释的项目视为没有注释。

在实践中,此注解仅对覆盖总体 NonNull 注解有用。

http://findbugs.sourceforge.net/manual/annotations.html

于 2010-05-10T19:04:14.023 回答
0

@Nullable 仅适用于您希望允许为空的那些参数、方法或字段。

似乎您允许 text 变量为空值。您可能应该改用 @NonNull 。

编辑

我为自己尝试了这个并得到了相同的结果。

findbugs 错误(来自确实给出空指针错误的第二种方法)报告中的文本说:

此参数始终以要求它为非空的方式使用,但该参数被显式注释为可空。参数的使用或注释的使用是错误的。

我的猜测是,由于它不是最终参数 FindBugs 不能/不会对 _close 的值做出任何假设,因为您可以在以后更改它。我什至尝试将 _closed variabel 方法限定在 m1 方法的范围内,但它仍然没有将其报告为错误。

于 2010-05-07T21:36:07.087 回答
0

您想使用 @CheckForNull 而不是 @Nullable

于 2010-05-07T22:03:40.493 回答
-1

运行 JavaLint - 我怀疑它会告诉你

System.out.println(text.toLowerCase());

在第一个示例中是无法访问的。由于它无法访问,我猜 FindBug 不在乎它可能会导致 NullPointerException

于 2010-05-07T21:43:19.047 回答