【问题标题】:Findbugs NP_ARGUMENT_MIGHT_BE_NULL not being triggered as expectedFindbugs NP_ARGUMENT_MIGHT_BE_NULL 未按预期触发
【发布时间】:2026-02-10 22:30:01
【问题描述】:

我将 Findbugs 与注释 javax.annotation.Nonnull 一起使用。在以下方法中

@Nonnull
public String methodA(@Nonnull String foo, @Nonnull Integer bar) {
    // missing checkNotNull(foo)
    // missing checkNotNull(bar)
    
    int fooLen = foo.length();    // did not check that foo is non-null
    
    return (bar < fooLen)? foo : null; // did not check that bar is non-null
}

参数 foo 和 bar 被声明为非 null,随后它们被取消引用,而无需首先检查它们是否为 null。 当我对代码运行 Findbugs(使用 Gradle Findbugs 插件)时,Findbugs 报告不包含预期的警告 NP_ARGUMENT_MIGHT_BE_NULL。来自 Findbugs 网站,对 NP_ARGUMENT_MIGHT_BE_NULL 的描述:

NP:方法不检查空参数(NP_ARGUMENT_MIGHT_BE_NULL)

此方法的一个参数已被标识为一个值,应始终检查它是否为空,但它在没有事先进行空检查的情况下被取消引用。

我做错了什么?

【问题讨论】:

    标签: java findbugs


    【解决方案1】:

    你告诉 findbugs foobar@Nonnull。这告诉 findbugs 查看对methodA 的调用,以了解参数是否为null 的可能性,如果找到它们则拒绝它们。

    在方法中,正是因为它们被@Nonnull注解,findbugs假定它们不能是null,因此允许你直接使用它们。

    您可能希望使用 @CheckForNull 为您期望的行为注释参数。

    【讨论】:

    • 不,我认为缺少一些配置。过去,在 Eclipse 中使用 Findbugs 或作为 Maven 插件,它会给出 NP_ARGUMENT_MIGHT_BE_NULL 警告。此外,将 '@'Nonnull 更改为 '@"CheckForNull 不会产生警告。
    • @user664894 如果您真的这么认为,请随时使用您的 Findbugs 配置更新您的问题。我只能说它对我有用。 @CheckForNull 正确警告。