Java 如何在Findbugs中使用@CheckForNull等?

Java 如何在Findbugs中使用@CheckForNull等?,java,eclipse,null,annotations,findbugs,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必须为非null,但标记为可为null 模式id:NP

当我通过Findbugs运行此命令时,会收到一条警告:

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

}
有关警告的详情如下:

错误:arg必须为非null,但标记为可为null 模式id:NP\u参数\u必须为\u非空\u但\u标记为\u可空,类型:NP,类别:样式

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

有人能解释一下Findbugs在这里抱怨什么吗

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

设置为FindBugs插件1.3.9.2009-适用于Eclipse3.6.1

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\U NULL\U在某个路径上\U从\U返回\U值,类型:NP,类别:样式

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


我基本上希望blah满足@CheckForNull要求,但如果我将其arg设置为@NonNull,我就不能这样做。我怎样才能让它工作呢?

你在自相矛盾。意味着,带注释的元素可能为null,但如果为null,则立即抛出

如果调用方传递null是不可接受的,我认为您应该改为对其进行注释:

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

你在自相矛盾。意味着,带注释的元素可能为null,但如果为null,则立即抛出

如果调用方传递null是不可接受的,我认为您应该改为对其进行注释:

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

当您将其与arg==null进行比较时,将其注释为@NonNull是否会导致问题,因为Findbugs认为这是不必要的?@poly,不,我测试过。它仅在将参数CheckForNull标记为空时发出警告。它不接受任何注释或非null。这是有道理的,因为非null本身并不强制执行。当您将其与arg==null进行比较时,将其注释为@NonNull不会导致问题,因为Findbugs认为它是不必要的吗?@poly,不,我已经测试过了。它仅在将参数CheckForNull标记为空时发出警告。它不接受任何注释或非null。这是有意义的,因为非null本身并不强制执行它自己。