如何在Findbugs中使用@CheckForNull等?

pol*_*nts 1 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";

}
Run Code Online (Sandbox Code Playgroud)

警告的详细信息如下:

错误: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!
Run Code Online (Sandbox Code Playgroud)

警告的细节是:

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

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

我基本上想要blah满足@CheckForNull要求,但如果我把它作为arg,我就做不到@NonNull.我如何让它工作?

Mat*_*hen 5

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

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

static @NonNull Object foo(@NonNull Object arg) {
Run Code Online (Sandbox Code Playgroud)