如何在Findbugs中使用@CheckForNull等?

时间:2010-11-02 04:46:07

标签: java eclipse null annotations findbugs

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

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

}

警告的详细信息如下:

  

错误:arg必须是非空的,但标记为可以为空   模式ID:NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE,输入:NP,类别:STYLE

     

此参数始终以要求非空的方式使用,但该参数明确注释为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!

警告的详细信息是:

  

错误:由于被调用方法的返回值而可能出现空指针取消引用   模式ID:NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE,输入:NP,类别:STYLE

     

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

我基本上希望blah满足@CheckForNull要求,但如果我将其arg设为@NonNull,我就无法做到。我如何让它工作?

1 个答案:

答案 0 :(得分:5)

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

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

static @NonNull Object foo(@NonNull Object arg) {