Как бы я передал примитив вместо указателя массива - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть школьное задание, где мне нужно создать базовый клон ArrayList в Java. Нужно работать только со строками и иметь минимальную функциональность (размер, добавление, получение). Это то, что я до сих пор. Я понимаю, что, возможно, есть много вещей, которые можно улучшить, но сейчас я пытаюсь устранить эту ошибку

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 голосов
/ 18 ноября 2018

Инициализируйте резервную копию с размером массива перед копированием.

backup = new String[array.length]; в методе side 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);
            }
        }
0 голосов
/ 18 ноября 2018

array - ноль. Потому что это

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

- это , а не конструктор. Удалить void. Как,

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

Далее, используйте backup = Arrays.copyOf(array, array.length), чтобы скопировать array в backup. Потому что это

backup[l] = array[l];

тоже взорвется.

...