javax.annotation:@Nullable vs @CheckForNull

时间:2012-09-06 13:47:58

标签: java annotations static-analysis findbugs

两者有什么区别?两者似乎都意味着该值可能为空,因此应相应处理,即检查为空。

更新 上面的两个注释是JSR-305 / FindBugs的一部分: http://findbugs.sourceforge.net/manual/annotations.html

3 个答案:

答案 0 :(得分:30)

我认为从您添加的链接中可以清楚地看出:如果您使用@CheckForNull并且使用该值的代码未检查null,则FindBugs会将其显示为错误。

FindBugs会忽略@Nullable

  

实际上,此注释仅用于覆盖总体NonNull注释。

在必须始终检查值的情况下使用@CheckForNull。使用@Nullable,其中null可能没问题。

编辑:目前似乎@CheckForNull不受支持,所以我建议避免使用@NonNull(另请参阅Which @NotNull Java annotation should I use?)。 另一个想法是直接与FindBugs开发人员取得联系,并询问他们对文档中不一致的看法。

答案 1 :(得分:9)

IntelliJ IDEA正确处理

@Nonnull@Nullable。 FindBugs发现了@Nonnull的问题,但错过了@Nullable@CheckForNUll的问题。 IDEA和FindBugs检测到的问题都标有注释。

package com.db.icestation;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class test {

    public @Nullable String nullable() {
        return "";
    }
    public @Nonnull String nonnull() {
        return null; // IDEA, findbugs
    }
    public @CheckForNull String checkForNull() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new test().nullable().length()); // IDEA
        System.out.println(new test().nonnull().length());
        System.out.println(new test().checkForNull().length());
    }
}

答案 2 :(得分:3)

在IntelliJ中,默认情况下支持@javax.annotation.Nullable,任何取消引用@Nullable参数或返回值的尝试都会导致警告。

@ alexander-pavlov,您可以在“常数条件和例外”检查的配置中添加@javax.annotation.CheckForNull。 Go File-> Settings-> Inspections-> Probable bugs-> Constant conditions&例外 - >配置注释。

我更喜欢这样做,因为@CheckForNull比上面的答案中提到的@lbalazscs的@Nullable具有更明确的含义。