我正在尝试纠正Eclipse中FindBugs插件在外部项目中发现的一些错误,并且我收到以下错误:
方法忽略返回值
在这段代码中:
int maxSize;
Queue<e> queue;
(...)
while (queue.size() > maxSize) {
queue.poll();
}
不幸的是,这是我所不知道的,我想知道poll()
方法除了返回E
类型对象之外有什么影响?如果我刚刚删除了这段代码,可以吗?
答案 0 :(得分:2)
poll()
方法将删除当前队列头部的对象并将其作为结果返回。
删除列出的代码中的poll()
将意味着while
循环将无休止地运行,因为您永远不会通过从中删除元素来更改队列长度。
FindBugs警告意味着您正在调用一个方法,该方法的返回类型不是void
,并且您没有将结果分配给另一个变量或在表达式中使用它。我不会修改代码,而是尝试使用注释来抑制警告或忽略整个警告。
答案 1 :(得分:1)
FindBugs维护一个方法数据库,该方法返回类型一般必须进行检查。此数据库中的Queue.poll()
方法为explicitly present:
addMethodAnnotation("java.util.Queue", "poll", "()Ljava/lang/Object;", false,
CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW);
请注意,警告优先级已分配为LOW,因此在这种情况下,FindBugs并不完全确定您做错了。
虽然您的代码似乎是安全的(至少对于非并发Queue
),但一般情况下如果您想要删除队列元素并且您绝对确定队列是非空的,那么最好使用Queue.remove()
。在这种情况下,如果出现问题,您将获得NoSuchElementException
而不是静默不正确的行为。错误应该表现出来。
因此,您可以忽略此错误(使用注释或使用xml排除过滤器)或将poll()
替换为remove()
。