【问题标题】:javax.annotation: @Nullable vs @CheckForNulljavax.annotation:@Nullable 与 @CheckForNull
【发布时间】:2012-08-31 08:40:15
【问题描述】:

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

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

【问题讨论】:

  • 我不认为这些注释来自 Java Bean Validation 的 API。您正在使用什么库/框架?它没有注释的文档吗?
  • 两者似乎都不是常规 Java API 的一部分。它们在哪里实施?
  • 更新了描述。它是 JSR-305 的一部分,我使用的实现是 FindBugs。
  • 值得注意的是,错误“覆盖@Nullable 参数”sourceforge.net/p/findbugs/bugs/1139 已在 findbugs 中修复。所以我们可以在实现中用 \@Nonull 覆盖它
  • 这些方法也是 Guava 集合框架的一部分

标签: java annotations static-analysis findbugs


【解决方案1】:

@Nonnull@Nullable 由 IntelliJ IDEA 正确处理。 FindBugs 发现了@Nonnull 的问题,但错过了@Nullable@CheckForNUll 的问题。 IDEA 和 FindBugs 检测到的问题用 cmets 标记。

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());
    }
}

【讨论】:

  • Eclipse 发现完全相同,假设它被配置为执行“Null 分析”并使用正确的注释(默认情况下它使用 JDT 注释而不是 JSR-305) .有趣的是,@CheckForNull 注解没有配置(但有@NonNullByDefault)。
  • FindBugs 2.0.1 检测到@CheckForNull 情况:“由于被调用方法的返回值可能导致空指针取消引用。”
  • @DavidHarkness - 我无法使用 2.0.1 重现它:github.com/lischenko/flaming-ninja(请参阅 findbugs.null.analysis)。 findbugs-maven-plugin=v2.5.2 - 最新,annotations=2.0.1
  • @vitaly - 我正在使用包含 FindBugs 的 Software Quality Environment plugin for NetBeans,并且该消息被标记为来自 FindBugs。我在我的项目中包含了 2.0.1 版本以获取注释,但也许该插件包含旧版本(有效)。
  • @vitaly - 我安装了 FB 2.0.1 并验证它没有正确检测到 @CheckForNull 注释。我不知道 SQE 插件使用的是哪个版本的 FB。
【解决方案2】:

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

@alexander-pavlov,您可以在“恒定条件和异常”检查的配置中添加@javax.annotation.CheckForNull。转到文件->设置->检查->可能的错误->恒定条件和异常->配置注释。

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

【讨论】:

    【解决方案3】:

    我认为您添加的链接很清楚:如果您使用 @CheckForNull 并且使用该值的代码不检查 null,FindBugs 会将其显示为错误。

    FindBugs 将忽略 @Nullable

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

    在必须始终检查值的情况下使用@CheckForNull。使用@Nullablenull 可能没问题。

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

    【讨论】:

    • 运行 Alexander 答案中的代码后,我从 FindBugs 得到的唯一警告是 nonnull() may return null, but is declared @NonNull At test.java:[line 19] In method com.db.icestation.test.nonnull() 错误描述是 Method may return null, but is declared @NonNull. This method may return a null value, but the method (or a superclass method which it overrides) is declared to return @NonNull. Bug kind and pattern: NP - NP_NONNULL_RETURN_VIOLATION
    • 我在这里找不到任何提及@CheckForNull:findbugs.sourceforge.net/bugDescriptions.html(@NonNull 在那里)
    • @vitaly - FindBugs 2.0.1 将@CheckForNull 违规报告为NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
    • @Nullable 专门告诉 FindBugs 忽略 null 的可能性,就像它对所有未注释的引用一样。我相信您永远不需要使用它,除非可能要处理您无法修改的第三方代码。
    • @DavidHarkness 对不起,我不太确定我能跟上。 @Nullable 注释有助于解决 Alex 代码中的 System.out.println(new test().nullable().length()); 等情况。如果我理解正确,它会专门告诉 FindBugs 分析null 的可能性。
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多