为什么我使用此ArrayList获取NullPointerException?

时间:2018-01-25 14:52:58

标签: java

当我向这个ArrayList添加一个对象时,我的resize方法给了我一个NullPointerException。列表初始化为1,第一个元素添加到数组中的0位。

这是我的arrayList AKA DynamicArray

//Implementation of a dynamic array
// Add remove methods


public class DynamicArray {
    private Object[] data;
    private int size;

public void DynamicArray(){
    data = new Object[1];
    size = 0;
}

public int size(){return size;}

public Object get(int index){return data[index];};

private void resizeIfFull()
{
    if (size < data.length){
        return;
        } else {
            Object[] bigger = new Object[2 * data.length];
            for (int i = 0; i < data.length; i++){
                bigger[i] = data[i];
                data = bigger;
        }
    }
}

public void add(Object obj){
    resizeIfFull();
    data[size] = obj;
    size++;
}

public void add(int index, Object obj){
    resizeIfFull(); 
    for(int i = size - 1; i >= index; i--){
        data[i+1] = data[i];
    }
    data[index] = obj;
    size++;
}

public void remove(int index){
    for(int i = index; i < size; i++){
        data[i] = data[i+1];
    }
    size--;
}

}

这是我的测试课。

public class AlgorTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    DynamicArray dynam = new DynamicArray();
    System.out.println(dynam.size());
    dynam.add("first");

}

}

这是测试类的输出。

0
Exception in thread "main" java.lang.NullPointerException
at DynamicArray.resizeIfFull(DynamicArray.java:20)
at DynamicArray.add(DynamicArray.java:38)
at AlgorTest.main(AlgorTest.java:8)

2 个答案:

答案 0 :(得分:6)

令人困惑的是,这不是构造函数:

public void DynamicArray(){
    data = new Object[1];
    size = 0;
}

这是一个名为DynamicArray的函数(非常混乱,我知道)。

如果没有具有构造函数的类,data仍为null并在您尝试访问数组时导致NPE。

删除void关键字,将函数转换为构造函数(然后初始化data等):

public DynamicArray(){
    data = new Object[1];
    size = 0;
}

答案 1 :(得分:6)

构造函数没有返回值,从构造函数(void)中删除返回类型

public DynamicArray(){
    data = new Object[1];
    size = 0;
}

在你从DynamicArray类初始化对象的情况下,默认构造函数将执行,什么都不做