почему мне нужно инициализировать этот массив элементов - PullRequest
0 голосов
/ 01 мая 2018

Если я не инициализирую этот массив элементов '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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

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

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

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

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

0 голосов
/ 01 мая 2018

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

Вы можете сделать это, используя 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;
    }

    // ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...