代码之家  ›  专栏  ›  技术社区  ›  vitaly

javax.annotation:@Nullable与@CheckForNull

  •  58
  • vitaly  · 技术社区  · 12 年前

    两者之间有什么区别?两者似乎都意味着该值可能为null,因此应进行相应处理,即检查是否为null。

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

    3 回复  |  直到 12 年前
        1
  •  37
  •   Community CDub    7 年前

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

    FindBugs将忽略 @Nullable

    在实践中,此注释仅适用于覆盖总体 NonNull 注释。

    使用 @检查为Null 在必须始终检查值的情况下。使用 @可为null 哪里 无效的 可能还可以。

    编辑:看来 @检查为Null 目前没有得到很好的支持,所以我建议避免使用 @NonNull (另请参阅 Which @NotNull Java annotation should I use? )。 另一个想法是直接与FindBugs开发人员联系,询问他们对文档中不一致的意见。

        2
  •  10
  •   Jared Burrows    5 年前

    @Nonnull @Nullable 由IntelliJ IDEA正确处理。FindBugs发现的问题 @非空 但是错过了 @可为null @CheckForNUll 。IDEA和FindBugs检测到的问题用注释标记。

    package com.db.icestation;
    
    import javax.annotation.CheckForNull;
    import javax.annotation.Nonnull;
    import javax.annotation.Nullable;
    
    public class test {
    
        @Nullable public String nullable() {
            return "";
        }
    
        @Nonnull public String nonnull() {
            return null; // IDEA, findbugs
        }
    
        @CheckForNull public 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());
        }
    }
    
        3
  •  5
  •   Alexander Pavlov    12 年前

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

    @亚历山大·帕夫洛夫,你可以加上 @javax.annotation.CheckForNull 在配置“恒定条件和异常”检查时。转到文件->设置->检查->可能的错误->恒定条件&例外情况->配置注释。

    我更喜欢这样做 @CheckForNull @可为null 正如@lbalazscs在上面的回答中提到的那样。