gpt4 book ai didi

java - Stream.forEach 期间出现空指针异常

转载 作者:行者123 更新时间:2023-12-02 05:35:26 26 4
gpt4 key购买 nike

我正在尝试模拟无限数的中位数。这是我的代码

package hard;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.stream.Stream;

public class Median
{
static Queue<Integer> minHeap;

static Queue<Integer> maxHeap;

{
minHeap = new PriorityQueue<>();

maxHeap = new PriorityQueue<>();
}

private static void add(Stream<Integer> randomNos)
{

randomNos.forEach(no ->
{
if (minHeap.size() == 0 || no < minHeap.peek())
{
minHeap.add(no);
}
else
{
maxHeap.add(no);
}

int diff = minHeap.size() - maxHeap.size();

if (Math.abs(diff) > 1)
{
if (diff < 0)
{
minHeap.add(maxHeap.peek());
}
else
{
maxHeap.add(minHeap.peek());
}
}
});

}
private static int median()
{
int median = 0;

if ((minHeap.size() + maxHeap.size()) % 2 == 0)
{
median = (minHeap.peek() + maxHeap.peek()) / 2;
}
else
{
if (minHeap.size() < maxHeap.size())
{
median = maxHeap.peek();
}
else
{
median = minHeap.peek();
}
}

return median;
}

public static void main(String[] args)
{
add(new Random().ints(1, 100000).boxed());
System.out.println(median());
}

}

我收到以下异常:

Exception in thread "main" java.lang.NullPointerException
at hard.Median.lambda$0(Median.java:25)
at hard.Median$$Lambda$2/1929600551.accept(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.stream.IntPipeline$4$1.accept(IntPipeline.java:250)
at java.util.Random$RandomIntsSpliterator.forEachRemaining(Random.java:1044)
at java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:693)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at hard.Median.add(Median.java:23)
at hard.Median.main(Median.java:75)

我运行调试器,发现有 2 个相同整数的值重复,之后此异常被刷新

最佳答案

这个

{
minHeap = new PriorityQueue<>();

maxHeap = new PriorityQueue<>();
}

是一个实例初始值设定项。您可能想要

static {
minHeap = new PriorityQueue<>();

maxHeap = new PriorityQueue<>();
}

以便在类初始化时执行它。

但请注意 PriorityQueue对象将为空。 peek将返回null不管怎样,<比较将会失败。您可能想要将一些对象添加到 PriorityQueue在使用对象之前。

关于java - Stream.forEach 期间出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25007513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com