当PriorityQueue.size() > 0时,为什么PriorityQueue.peek()会返回null?

3

当PriorityQueue.size() > 0时,Android上的PriorityQueue.peek()返回null,我遇到了这个问题。

enter image description here

我认为这可能是设备问题。有人有什么想法吗?


1
根据JavaDoc,当它是头元素或队列为空时,peek只会返回null。我看到你的push方法检查了null,但你确定没有其他可能将null推入队列吗?你能否输出头元素的日志或进行调试?请发布一个最小的可运行示例来产生错误,而不是一张图片,这样人们就可以尝试它。 - Malte Hartwig
队列的头部必须为空。 - Amit Bhandari
感谢您的回答。唯一可能的情况是队列头为空。需要找出发生了什么。 - Vytautas Berankis
你的 JobComparator 中的 compare 方法存在问题。如果 lhs.priorityInteger.MIN_VALUE(或接近该值),而 rhs.priority 是正数,则 lhs.priority() - rhs.priority() 将导致整数溢出,从而得到错误的答案。正确的方法是 return lhs.priority().compareTo(rhs.priority()); - Jim Mischel
2个回答

0

我看到两个解决方法:

  • jobs.peek() != null 替换为 jobs.size() > 0 - 你关心的是队列的大小,对吧?
  • 检查一下 jobs 队列里面有什么。因为根据 Java 文档(https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html),peek() 方法应该返回 "此队列的头部,或者在此队列为空时返回 null"。所以,要么这个队列为空,要么它里面有一个值为 null 的元素。

0

好的。经过一段时间,问题已经解决了。基本上这是并发问题。将PriorityQueue.java更改为PriorityBlockingQueue.java解决了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接