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、番石榴或我自己的用法,谁错了?
似乎默认情况下Google Guava Functions默认为@Nullable-我收到Findbugs错误,说明“结果必须为非空,但在没有注释时被标记为可空”。以以下方式将@Nonnull添加到函数声明中有所帮助:
new Function<Object, Object>() {
@Nonnull
public Object apply(@Nonnull Object object) {
现在Findbugs很高兴谢谢大家
标记参数@Nonnull
可以解决findbugs的问题。
你的实现是错误的;)
基本上文档说(我会解释和强调):
@如果
输入
为空,且具体函数实现不接受空参数,则抛出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?