我该如何传递基本元素而不是数组指针

时间:2018-11-18 04:25:42

标签: java arrays string pointers nullpointerexception

我有一个学校作业,需要在Java中创建ArrayList的非常基本的克隆。它只需要使用字符串,并且功能最少(大小,添加,获取)。到目前为止,这就是我所拥有的。我意识到可能有很多可以改进的地方,但是现在我正在尝试解决此错误

Exception in thread "main" java.lang.NullPointerException
at pt2.ArrayListMine.expand(ArrayListMine.java:13)
at pt2.ArrayListMine.add(ArrayListMine.java:32)
at pt2.Driver.main(Driver.java:21

我认为问题在于,当我调用expand()而不是将字符串从数组移动到备份,然后再备份到数组时,它传递了指针,因此,在我调用它之后,我有效地使数组指向了备份并指向数组。我不确定是否/如何强制它传递字符串而不是指针,因此我希望可以得到一些建议。谢谢!

    package pt2;

    public class ArrayListMine {
        private  String[] array;
        private  String[] backup;
        private  int array_size = 0;
        public void ArrayListMine() {
             array = new String[10];
        }


        private void expand() {
            if(array_size == array.length) {
                for(int l = 0; l < array.length; l++) {
                    backup[l] = array[l];
                }
                int new_size = (int) (array.length * 2);
                array = new String[new_size];
                for(int l = 0; l < backup.length; l++) {
                    array[l] = backup[l];
                }
            }
        }

        public int size() {
            return array_size;
        }

        public void add(String value) {
            array_size = array_size + 1;
            System.out.println(array_size);
            expand();
            array[array_size - 1] = value;
        }

        public String get(int index) {
            return array[index];
        }
    }

2 个答案:

答案 0 :(得分:0)

videos为空。因为这个

/hdd/videos

不是构造函数。 删除 array。喜欢,

public void ArrayListMine() {
     array = new String[10];
}

接下来,使用voidpublic ArrayListMine() { array = new String[10]; } 复制到backup = Arrays.copyOf(array, array.length)。因为这个

array

也会爆炸。

答案 1 :(得分:0)

在复制之前使用阵列大小初始化备份。

backup = new String[array.length];expand边的方法中,然后再复制到该方法。

public class ArrayListMine {
    private  String[] array;
    private  String[] backup;
    private  int array_size = 0;

    public  ArrayListMine() {
         array = new String[10];

    }


    private void expand() {
        if(array_size == array.length) {
            backup = new String[array.length];
            for(int l = 0; l < array.length; l++) {
                backup[l] = array[l];
            }
            int new_size = (int) (array.length * 2);
            array = new String[new_size];
            for(int l = 0; l < backup.length; l++) {
                array[l] = backup[l];
            }
        }
    }

    public int size() {
        return array_size;
    }

    public void add(String value) {
        array_size = array_size + 1;
        System.out.println(array_size);
        expand();
        array[array_size - 1] = value;
    }

    public String get(int index) {
        return array[index];
    }

    public static void main(String[] args) {
        ArrayListMine arrayListMine = new ArrayListMine();
        for(int i=0;i<=20;i++) {
            arrayListMine.add("test "+i);
        }
    }
}

进一步,您可以将for循环替换为System.arrayCopy

private void expand() {
            if(array_size == array.length) {
                backup = new String[array.length];
                System.arraycopy(array, 0, backup, 0, array_size);
                /*for(int l = 0; l < array.length; l++) {
                    backup[l] = array[l];
                }*/
                int new_size = (int) (array.length * 2);
                array = new String[new_size];
                /*for(int l = 0; l < backup.length; l++) {
                    array[l] = backup[l];
                }*/
                System.arraycopy(backup, 0, array, 0, array_size);
            }
        }