【问题标题】:Why am I getting a NullPointerException with this ArrayList? [duplicate]为什么我在这个 ArrayList 中得到 NullPointerException? [复制]
【发布时间】:2018-01-25 14:52:58
【问题描述】:

每当我向这个 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)

【问题讨论】:

  • 你在哪一行得到 NPE?
  • data = bigger; 应该在循环之后完成。
  • 移除构造方法中的 void 类型
  • 您可以开始使用 IDE,它会立即突出显示这些烦人的浪费时间的错误(并且还会自动格式化您的代码)。
  • 以前的副本可能是一般性的,但仍然解释了问题所在(但在这种特定情况下不一定是原因)。我建议不要重新打开它,而是在重复列表中添加更具体的问题,例如 java “void” and “non void” constructor(现在不能这样做,因为不能对同一个问题进行多次近距离投票)。

标签: java


【解决方案1】:

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

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

这是一个名为 DynamicArray 的函数(我知道这很令人困惑)。

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

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

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

【讨论】:

  • 我一定是在自动驾驶仪上输入了 void!非常感谢!
【解决方案2】:

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

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

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

【讨论】:

  • 成功了,谢谢阿里!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2014-01-29
  • 2020-07-18
相关资源
最近更新 更多