1

当我通过 Findbugs 运行它时,我收到一个警告:

static @NonNull Object foo(@CheckForNull Object arg) {
    if (arg == null) { // warning on this line
        throw new NullPointerException();
    }
    return "something";

}

警告的详细信息如下:

Bug:arg必须为非空但被标记为可为空
模式 id: NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE, type: NP, category:STYLE

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

有人可以解释一下 Findbugs 在这里抱怨什么吗?

请注意,我使用的是edu.umd.cs.findbugs.annotations.*成员,而不是javax.annotations.*. (有区别吗?)

为 Eclipse 3.6.1 设置的是 FindBugs 插件 1.3.9.2009-。


Matthew Flaschen 建议我@NonNull改用,但现在我遇到了这个问题:

static void blah(@NonNull Object arg) {
    if (arg == null) {
        throw new NullPointerException();
    }
    System.out.println(arg);
}

static @CheckForNull Object bleh() {
    return null;
}

//...
blah(bleh()); // warning here!

警告的详细信息是:

错误:由于调用方法的返回值可能导致空指针取消引用
Pattern id: NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE, type: NP, category:STYLE

方法的返回值在没有检查的情况下被取消引用null,并且该方法的返回值通常应该被检查null。这可能会导致NullPointerException代码被执行。

我基本上想blah满足@CheckForNull要求,但是如果我将其设为 arg be ,我将无法做到@NonNull。我怎样才能让它工作?

4

1 回答 1

5

你在自相矛盾。 CheckForNull意思是,“带注释的元素可能为空”,但如果是,则立即抛出。

如果调用者传递 null 是不可接受的,我相信你应该改为注释它:

static @NonNull Object foo(@NonNull Object arg) {
于 2010-11-02T04:54:47.807 回答