谷歌番石榴函数界面中的@Nullable输入会触发 FindBugs 警告

2022-09-01 06:59:30

该界面(来自Google Guava)定义为:com.google.common.base.Functionapply

@Nullable T apply(@Nullable F input);

该方法具有以下 javadoc 注释:

@throws NullPointerException if {@code input} is null and this function does not accept null arguments.

FindBugs抱怨我对函数的实现:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

带有高优先级警告:

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE,优先级:高

输入必须为非空值,但标记为可为空

此参数的使用方式始终要求它为非空值,但该参数被显式注释为 Nullable。参数或注释的使用是错误的。

我的函数不支持输入,如果是这种情况,则会引发异常。如果我理解正确,FindBugs将此视为非空值的要求。null

对我来说,这似乎是一个矛盾:输入是@Nullable但方法@throws NullPointerException,当它为空时。我错过了什么吗?

摆脱我能看到的警告的唯一方法是手动抑制。(显然,番石榴代码超出了我的控制范围)。

谁对@Nullable注释,FindBugs,番石榴或我自己的使用是错误的?


答案 1

您的实现是错误的;)

基本上文档说(我会解释和强调):

@throws NullPointerExceptionif 为 null 并且具体函数实现不接受 null 参数input

通过实现函数,您必须确定它是否接受 null。在第一种情况下:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        return input == null ? null : input.field;
    }
}

在第二种情况下:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

在这两个示例中,都允许返回 null。

编辑:

请注意,Guava在所有软件包上使用,因此如果存在,则表示“暂停全局并允许此处为空值”,如果不是,则表示“此处禁止空值”。@javax.annotation.ParametersAreNonnullByDefault@Nullable@Nonnull

也就是说,您可能希望在参数或包中使用注释,以告知FindBugs Function的参数不能为空。@Nonnull@ParametersAreNonnullByDefault

编辑2:

事实证明,这个案例是已知的问题,请参阅评论#3(来自Guava的首席开发人员Kevin Bourrillion,关于他与Findbugs的领导Bill Pugh的对话):

我的参考是与比尔·皮尤(Bill Pugh)的一系列面对面对话。他毫不含糊地断言,这意味着只有一些子类型可能接受null。这似乎得到了findbugs的证实 - 我们的代码非常干净地通过了可空性检查(尽管我们应该再次检查,因为进行了这个特定的函数更改)。@Nullable


答案 2

标记参数可解决查找虫中的问题。@Nonnull


推荐