这个优先级队列逻辑java有什么问题?

这个优先级队列逻辑java有什么问题?,java,Java,当添加到此队列时,我不断收到一个空指针异常,尤其是使用percolate up时。我想我的设置有问题,但我想不出来。当我尝试添加东西时,我得到一个错误,我的IDE说这是一个空指针异常,并且是compare方法中的一个问题,这使我认为compare方法中的if-else语句指向一个空值。我不明白他们为什么会这样 public class GenericHeap<E> { int size; int capacity = 10; public E[] heap; Comparator m

当添加到此队列时,我不断收到一个空指针异常,尤其是使用percolate up时。我想我的设置有问题,但我想不出来。当我尝试添加东西时,我得到一个错误,我的IDE说这是一个空指针异常,并且是compare方法中的一个问题,这使我认为compare方法中的if-else语句指向一个空值。我不明白他们为什么会这样

public class GenericHeap<E> {
int size;
int capacity = 10;
public E[] heap;
Comparator mycomparator;

public GenericHeap(Comparator c) {
    heap = (E[]) new Object[capacity];
    mycomparator = c;

}
public void add(E e) {
    if (size == 0) {
        heap[size++] = e;
    } else {
        heap[size++] = e;
        this.percolateup(this.size);

    }

}

private void percolateup(int I) {
    E temp;
    while (I / 2 > 0) {
        if (mycomparator.compare(heap[I / 2], heap[I]) == 1) {
            temp = heap[I / 2];

            heap[I / 2] = heap[I];
            heap[I] = temp;

        }
        I = I / 2;

    }
}
 public int compare(String t, String t1) {
    if (t.length()>t1.length()){
    return 1;}
    else if (t.length()<t1.length()){
    return -1;}
    return t.compareTo(t1);


}}

您将索引提前一步,堆[I]仍然为空

假设您正在添加第二项

@条目:大小==1

沿着else路径,设置heap[1]=e,然后将大小增加到2。然后调用percolateup2。注意这里I==2时会发生什么:

if (mycomparator.compare(heap[I / 2], heap[I]) == 1) {
您可以访问堆[2],当然还没有设置。NPE

以上就是为什么你会得到NPE…现在进一步推测。我真的不理解percolateup的逻辑,但我敢打赌问题在于你过于激进地提升了规模的价值。可能不是:

heap[size++] = e;
this.percolateup(this.size);
这可能会有帮助

heap[size] = e;
this.percolateup(this.size);
size++

另一方面,你有一种风格导致了这种混乱。在add中,您直接引用成员变量size size++。这没什么错;但是你转过身来,进入这个.size。编译器很高兴,但这种不一致的风格无助于您的理解。我个人更喜欢只使用这个。当绝对需要时,但这是个人喜好。

那么,您是否在调试器中逐步完成了代码?这就是步骤1。您能提供堆栈跟踪吗?看起来您正在向队列中添加一个尚未实例化的对象。确保要添加到队列中的对象已实例化并具有有效引用。另外,您还没有在这里给出完整的代码。队列在哪里?堆是什么类型?当您执行heap[size++]时,如何确保您试图访问heap元素的对象确实存在?我编辑并添加了构造函数和实例变量。我意识到我需要添加一个增加容量的方法,但是当我的测试仪没有超过容量时,我就出现了错误。