Почему мне нужно инициализировать этот массив членов

Если я не инициализирую этот массив элементов arryMem с такой же ожидаемой длиной, я получаю nullPointerException, но с инициализацией он работает, помогите мне понять это, пожалуйста.

class BubRec {

    Integer arryMem[] = {0, 0, 0, 0, 0, 0, 0};// if arrMem[]; throws NullPointerException
    int n;


    BubRec(Integer ary[]) {
        for (int i = 0; i <= ary.length - 1; i++) {
            arryMem[i] = ary[i];
        }
        n = arryMem.length;
    }


    Integer[] sortBubRec() {
        int temp = 0;
        if (n >= 0) {
            for (int i = 0; i < (arryMem.length - 1); i++) {
                if (arryMem[i] > arryMem[i + 1]) {
                    temp = arryMem[i];
                    arryMem[i] = arryMem[i + 1];
                    arryMem[i + 1] = temp;
                }
            }
            n--;
            sortBubRec();
        }
        return arryMem;
    }
}

public class BubbleRecMain {

    public static void main(String[] args) {
        Integer arry[] = {34, 56, 78, 1, 2, 4, 7};
        BubRec bubRec = new BubRec(arry);
        Integer sortedArry[] = bubRec.sortBubRec();
        for (int i = 0; i < sortedArry.length; i++) {
            System.out.println(sortedArry[i]);
        }
    }
}

Выход:

1 2 4 7 34 56 78

Как вы ожидаете получить доступ к неинициализированному массиву?

Compass 01.05.2018 16:27

Очевидно, вы пытаетесь получить доступ к элементу массива, даже не инициализировав его, т.е. в arryMem [i]

Amit 01.05.2018 16:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Потому что вы должны указать длину массива, прежде чем пытаться его заполнить.

Вы можете сделать это, используя arryMem = new Integer[ary.length]; в конструкторе BubRec:

class BubRec {

    Integer arryMem[];
    int n;

    BubRec(Integer ary[]) {
        arryMem = new Integer[ary.length];
        for (int i = 0; i <= ary.length - 1; i++) {
            arryMem[i] = ary[i];
        }
        n = arryMem.length;
    }

    // ...

}

Когда вы пишете Integer arryMem [] = {0,0,0,0,0,0,0};, java выделяет массив длиной 7, потому что вы вставили семь элементов. В качестве альтернативы вы можете выделить массив той же длины, набрав Integer arryMem [] = new Integer [7]. Если вы вставляете значения напрямую, java сделает это автоматически.

Теперь ваша проблема в том, что когда вы набираете Integer arrayMem [];, никто не выделяет память, кроме java, потому что вы не вставляли никаких значений, ни вы. Итак, если вы вызовете элемент в этом массиве, вы получите Исключение нулевого указателя, потому что нет никаких элементов ...

Итак, вы должен выделяете память (создаете объект), прежде чем сможете ее использовать. Вы можете сделать это, как уже было замечено, несколькими способами. Вы можете сделать это и инициализировать все элементы за один шаг, набрав ...

this.arryMem = Arrays.copyOf(ary, ary.length);

... в вашем конструкторе.

Хорошее решение, но я думаю, что вероятность того, что кто-то знает об этом решении и не знает, как создать экземпляр массива одновременно, довольно низка.

TwiN 01.05.2018 16:41

Другие вопросы по теме