我看到两个解决方法: 将 jobs.peek() != null 替换为 jobs.size() > 0 - 你关心的是队列的大小,对吧? 检查一下 jobs 队列里面有什么。因为根据 Java 文档(https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html),peek() 方法应该返回 "此队列的头部,或者在此队列为空时返回 null"。所以,要么这个队列为空,要么它里面有一个值为 null 的元素。
peek
只会返回null
。我看到你的push
方法检查了null
,但你确定没有其他可能将null
推入队列吗?你能否输出头元素的日志或进行调试?请发布一个最小的可运行示例来产生错误,而不是一张图片,这样人们就可以尝试它。 - Malte HartwigJobComparator
中的compare
方法存在问题。如果lhs.priority
是Integer.MIN_VALUE
(或接近该值),而rhs.priority
是正数,则lhs.priority() - rhs.priority()
将导致整数溢出,从而得到错误的答案。正确的方法是return lhs.priority().compareTo(rhs.priority());
。 - Jim Mischel