三元堆空指针异常

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;

【讨论】:

以上是关于三元堆空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

三元表达式空指针问题

三元表达式空指针问题

三元表达式空指针问题

jsp 505空指针异常

Collectors.toMap空指针异常

java中的空指针异常怎么解决