当前位置: 首页 > 知识库问答 >
问题:

@Google Guava Function界面中的可空输入触发FindBugs警告

仲孙子辰
2023-03-14

com.google.常见的基础函数interface(来自Google Guava)将apply定义为:

@Nullable T应用(@Nullable F输入);

该方法有以下javadoc注释:

@throws NullPointerException如果{@code输入}为空并且此函数不接受空参数

FindBugs抱怨我的html" target="_blank">功能实现:

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,优先级:高

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

此参数的使用方式总是要求其为非Null,但该参数被显式注释为可为Null。参数或注释的使用是错误的。

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

在我看来,这似乎是一个矛盾:输入是@Nullable的,但方法@null时抛出NullPointerException。我错过什么了吗?

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

关于@Nullable annotation、FindBugs、番石榴或我自己的用法,谁错了?

共有3个答案

卢黎明
2023-03-14

似乎默认情况下Google Guava Functions默认为@Nullable-我收到Findbugs错误,说明“结果必须为非空,但在没有注释时被标记为可空”。以以下方式将@Nonnull添加到函数声明中有所帮助:

new Function<Object, Object>() {
            @Nonnull
            public Object apply(@Nonnull Object object) {

现在Findbugs很高兴谢谢大家

龙新荣
2023-03-14

标记参数@Nonnull可以解决findbugs的问题。

荆哲
2023-03-14

你的实现是错误的;)

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

@如果输入为空,且具体函数实现不接受空参数,则抛出NullPointerException

通过实现你的函数,你必须决定它是否接受空值。在第一种情况下:

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。

编辑:

请注意,番石榴使用@javax。注释。默认情况下,所有包上的参数均为空,因此,如果存在@Nullable,则表示“暂停全局@Nonnull并允许此处为空”,否则表示“此处禁止为空”。

也就是说,您可能希望在参数上使用@Nonnull注释,或者在包中使用@parameters arenonnullbydefault来告诉FindBugs函数的参数不能为null。

编辑2:

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

我提到的是与比尔·普格的一系列面对面的对话。他毫不含糊地断言,@Nullable只意味着某些子类型可能接受null。findbugs似乎为我们证明了这一点——我们的代码非常干净地通过了可空性检查(尽管我们应该再次检查,因为这个特定的函数发生了更改)。

 类似资料:
  • 问题内容: 我有一个在更改textarea的值时调用的函数。它很好用,除非按下空格键,然后什么也没叫。有没有办法激活它?从技术上讲,内容在变化,我希望无论如何都要调用该函数。 我在代码上摆弄小提琴。您可以看到按下空格键时,数组不会推送新的元素(也请按Enter键),但是其他非空白键都可以。 小提琴示例:http : //jsfiddle.net/UJWLN/4/ 问题答案: 您可以在输入中使用指令

  • 我在用Python编写的Apache Beam管道中处理分析命中。我使用的是10分钟的FixedWindows,当窗口为空时,我希望触发警报(例如,使用Cloud Pub/sub)。到目前为止,我所做的是:

  • 问题内容: 我正在使用字符串作为锁,因此想确保该对象是一个新实例。FindBugs抱怨,因为直接定义字符串(使用双引号)通常更有效。我的代码如下: 我在这里做错什么了吗?Eclipse FindBugs插件仍将其报告为问题: 问题答案: 好的,所以尽管其他两个答案都很有趣且有用(两个都是+1),但我并没有最终更改代码,而是要接受自己的答案。为了使FindBugs满意,我将注释从成员变量移到了周围的

  • 如果用户试图在文本框中粘贴字符串,我想清空警报输入。这是我的代码: 到目前为止,我正在检测粘贴事件,但清空文本框的代码不起作用。我还尝试使用: document.getElementById('txtSerial'). value = ''; document.getElementById('txtSerial')["值"] = ''; event.src元素["值"] = '"; 但是这些似乎都

  • 配置报警策略的时候open-falcon支持多种报警触发函数,比如all(#3) diff(#10)等等。 这些#后面的数字表示的是最新的历史点,比如#3代表的是最新的三个点。该数字默认不能大于10,大于10将当作10处理,即只计算最新10个点的值。 说明:#后面的数字的最大值,即在 judge 内存中保留最近几个点,是支持自定义的,具体参考 book 中描述 ; 源码位置 => cfg.exam

  • 嗨我有以下方法: 不得不提的是,startDate和endDate是长变量。我尝试在if条件中添加null检查,也尝试使用longValue()方法,但没有结果。你知道我怎样才能解决这个问题吗?可能是fndBugs端的bug?