Stream.forEach 중 Null 포인터 예외
-
20-12-2019 - |
문제
무한한 숫자의 중앙값을 시뮬레이션하려고 합니다.이것이 내 코드입니다.
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
물건을 사용하기 전에.
제휴하지 않습니다 StackOverflow