Queue.poll() 的效果

Effect of Queue.poll()

我正在尝试更正外部项目中 Eclipse 中的 FindBugs 插件发现的一些错误,但出现以下错误:

Method ignores return value

在这段代码中:

int maxSize;
Queue<e> queue;

(...)

while (queue.size() > maxSize) {
    queue.poll();
}

不幸的是,这超出了我的知识范围,我想知道 poll() 方法除了返回 E 类型对象之外的效果是什么?如果我只是删除这段代码可以吗?

poll() 方法将删除当前作为队列头部的对象,并因此 return 它。

在列出的代码中删除 poll() 将意味着 while 循环将无休止地 运行,因为您永远不会通过从队列中删除元素来更改队列长度。

FindBugs 警告意味着您正在调用一个 return 类型不是 void 的方法,并且您没有将结果分配给另一个变量或在表达式中使用它。我不会修改代码,而是尝试使用注释抑制警告或忽略整个警告。

FindBugs 维护着一个方法数据库,return 通常 必须 检查这些方法。 Queue.poll() 方法在这个数据库中是 explicitly present:

addMethodAnnotation("java.util.Queue", "poll", "()Ljava/lang/Object;", false,
            CheckReturnValueAnnotation.CHECK_RETURN_VALUE_LOW);

请注意,警告优先级被指定为低,因此在这种情况下,FindBugs 不能完全确定您是否做错了事。

虽然你的代码看起来是安全的(至少对于非并发Queue),但一般来说,如果你想删除队列元素并且你绝对确定队列是非空的,那更好使用 Queue.remove()。在这种情况下,如果出现问题,您将得到 NoSuchElementException 而不是默默地不正确的行为。错误应该会自行显现。

所以在这里你可以忽略这个错误(使用注释或使用 xml 排除过滤器)或将 poll() 替换为 remove().