插入二进制堆时是否出现NullPointerException?

时间:2015-04-14 15:20:04

标签: java insert nullpointerexception heap min-heap

我试图将值插入最初为空的二进制堆。

这是相关代码:

public class minHeap
{
    int[] array;
    int n;

    public void minHeap() 
    {
        array = new  int [16];  
        n = 0;
    }

    public void insert(int x) {
        //if (n == array.length - 1)
        //enlargeArray(array.length*2 + 1);

        // Hole is generated at end of array
        int hole = ++n;
        System.out.println("H"+hole);

        // Percolate up
        for (array[0] = x; x < array[hole/2]; hole /= 2)
            array[hole] = array[hole/2];

        // Insert new element
        array[hole] = x;
    }

我从insert方法获取for循环中的NullPointerException。这是我处理最初空阵列的方式吗?

这是初始化类:

public class BinaryHeap {

    public static void main(String[] args) 
    {
        int [] heapArray =  {62, 75, 81, 71, 66, 69, 72, 73, 83, 82, 67, 72, 81, 73, 69, 90};

        minHeap hp = new minHeap();

        for(int i = 0; i < heapArray.length; i++)
        {
            hp.insert(heapArray[i]);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

array未初始化,因为:

public void minHeap() 
{
    array = new  int [16];  
    n = 0;
}

不是构造函数。构造函数没有返回类型,因此这只是一个常规方法,恰好与该类共享同名。

这意味着当您使用new minHeap()时,您只需调用默认构造函数,该构造函数不会初始化任何字段,而array的默认值为null

您要删除void,如下所示:

public minHeap()
{
    array = new  int [16];  
    n = 0;
}

由于这是一个有效的构造函数,因此在创建实例时,array将被正确初始化。

答案 1 :(得分:2)

您尚未定义构造函数。

你写了......

public void minHeap()

这是一种方法,因为它有一个&#34; void&#34;返回类型。

如果你放弃&#34; void&#34;它可能会有所帮助

答案 2 :(得分:0)

除了这里的其他答案(指出你想要的构造函数没有正确的签名),看起来你会遇到问题:

for (array[0] = x; x < array[hole/2]; hole /= 2)

在第一次插入时,hole = 0但显然x等于array[hole/2],因为hole/2的计算结果为0,所以此循环退出而不在n = 1上运行。

在第二次插入时,array[0] = x会将先前传递中插入array[0]的内容清除掉,并将其替换为新的x

我可以看到你正在尝试做什么,但它确实非常正确。