在使用add方法时,出现空指针异常。

在使用add方法时,出现空指针异常。

对照了老师的您的代码,好象没有区别。

但还是出现了空指针异常,麻烦帮忙看看是什么原因。


https://img1.sycdn.imooc.com/climg/66ce901f098a416309560426.jpg


相关代码:

public class Main {
    public static void main(String[] args) {

        Array<Integer> arr = new Array<>();
        for (int i = 0; i < 10; i++) {
            arr.addLast(i);
        }
        System.out.println(arr);

    }
}

相关代码:

public class Array<E> {
    private E[] data;
    private int size;

    public Array(int capacity) {
        E[] data = (E[]) new Object[capacity];
        size = 0;
    }

    public Array() {
        this(10);
    }

    public int getCapacity() {
        return data.length;
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void add(int index, E e) {

        if (index < 0 || index > size) {
            throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
        }

        if (size == data.length) {
            resize(2 * data.length);
        }

        for (int i = size; i > index; i --) {
            data[i] = data[i - 1];
        }

        data[index] = e;
        size ++;
    }

    public void addFirst(E e) {
        add(0, e);
    }

    public void addLast(E e) {
        add(size, e);
    }

    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Get failed. Index is illegal.");
        }

        return data[index];
    }

    public void set(int index, E e) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Set failed. Index is illegal.");
        }

        data[index] = e;
    }

    public boolean contains(E e) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)) {
                return true;
            }
        }

        return false;
    }

    public int find(E e) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)) {
                return i;
            }
        }

        return -1;
    }

    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Remove failed. Require index >= 0 and index < size.");
        }

        E ret = data[index];

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

        data[size - 1] = null;
        size --;

        if (size == data.length / 4 && data.length / 2 != 0) {
            resize(data.length / 2);
        }

        return ret;
    }

    public E removeFirst() {
        return remove(0);
    }

    public E removeLast() {
        return remove(size - 1);
    }

    public void removeElement(E e) {
        int index = find(e);

        if (index != -1) {
            remove(index);
        }
    }

    @Override
    public String toString() {

        StringBuilder res = new StringBuilder();
        res.append(String.format("Array:size = %d , capacity = %d\n", size, getCapacity()));
        res.append('[');
        for (int i = 0; i < size; i++) {
            res.append(data[i]);

            if (i < size - 1) {
                res.append(", ");
            }
        }
        res.append(']');

        return res.toString();
    }

    private void resize(int newCapacity) {
        if (newCapacity < size) {
            throw new IllegalArgumentException("Resize is failed. require newCapacity >= size.");
        }

        E[] newData = (E[]) new Object[newCapacity];

        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }

        data = newData;
    }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2024-09-17 09:54:59

构造函数中的

public Array(int capacity) {
    E[] data = (E[]) new Object[capacity];
    size = 0;
}



应该改成:

public Array(int capacity) {
    data = (E[]) new Object[capacity];
    size = 0;
}

否则你在构造函数中新声明了一个局部变量 data,并为其开辟了空间,在构造函数结束后,这个局部变量的生命周期就结束了,空间自动释放。整个过程没有为类成员变量 data 开辟空间。


继续加油!:)


  • 提问者 李泉成278 #1

    好的,谢谢波波老师。

    2024-09-30 07:08:56
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师