三元堆空指针异常
Posted
技术标签:
【中文标题】三元堆空指针异常【英文标题】:Ternary Heap Null Pointer Exception 【发布时间】:2018-02-14 16:37:02 【问题描述】:package queue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TernaryHeap <T extends Comparable<T>> extends
AbstractPriorityQueue<T>
private List<T> keys;
private int size;
public TernaryHeap()
this(Comparator.naturalOrder());
public TernaryHeap(Comparator<T> comparator)
super(comparator);
keys = new ArrayList<>();
keys.add(null);
size=0;
@Override
public int size() return size;
@Override
public void add(T key)
keys.add(key);
swim(++size);
@Override
protected T removeAux()
Collections.swap(keys, 1, size);
T max = keys.remove(size--);
sink(1);
return max;
private void swim(int k) // intended to identify parent method and swap if child is bigger than parent
while (1 < k && comparator.compare(keys.get((k-1)/3), keys.get(k)) < 0)
Collections.swap(keys, (k-1)/3, k);
k -= 1; k /= 3;
private void sink(int k) // not sure if I got this right... intended to compare keys with 2 other children
for (int i=k*3; i<=size; k=i,i*=3)
if (i < size && comparator.compare(keys.get(i), keys.get(i+1)) < 0 && comparator.compare(keys.get(i), keys.get(i+2)) < 0) i++;
if (comparator.compare(keys.get(k), keys.get(i)) >= 0)
break;
Collections.swap(keys, k, i);
运行我的测试方法时,我收到此错误:
java.lang.NullPointerException
at
java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:52)
at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47)
at queue.TernaryHeap.swim(TernaryHeap.java:47)
at queue.TernaryHeap.add(TernaryHeap.java:33)
我不确定 NullPointerException 是从哪里来的,我已经尝试了很长时间...请帮助我!我不知道该怎么做... 我不确定 NullPointerException 是从哪里来的,而且我一直在努力解决这个问题......请帮帮我!我不知道该怎么做... 我不确定 NullPointerException 是从哪里来的,而且我一直在努力解决这个问题......请帮帮我!我不知道该怎么做......
【问题讨论】:
【参考方案1】:你有这个代码:
if (i < size && comparator.compare(keys.get(i), keys.get(i+1)) < 0 && comparator.compare(keys.get(i), keys.get(i+2)) < 0) i++;
如果i = size-1
会发生什么?也就是说,i
正在引用堆中的最后一个节点。然后keys.get(i+1)
将返回null
(或者可能会崩溃,因为您试图索引超出列表的末尾)。
要正确执行此操作,您需要在尝试获取和比较项目之前检查每个索引是否在范围内。
您正在做的是检查索引k
处的键是否小于其所有子项。所以首先你要找到最小的孩子。我过去这样做的方式是:
int smallestChild = i;
if (i < size-1 && comparator.compare(keys.get(smallestChild), keys.get(i+1)) < 0)
++smallestChild;
if (i < size-2 && comparator.compare(keys.get(smallestChild), keys.get(i+2)) < 0)
++smallestChild;
// Then compare the key at `k` with the smallest child:
if (comparator.compare(keys.get(k), keys.get(smallestChild) >= 0)
break;
【讨论】:
以上是关于三元堆空指针异常的主要内容,如果未能解决你的问题,请参考以下文章