Если я не инициализирую этот массив элементов 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
Очевидно, вы пытаетесь получить доступ к элементу массива, даже не инициализировав его, т.е. в arryMem [i]
Потому что вы должны указать длину массива, прежде чем пытаться его заполнить.
Вы можете сделать это, используя 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);
... в вашем конструкторе.
Хорошее решение, но я думаю, что вероятность того, что кто-то знает об этом решении и не знает, как создать экземпляр массива одновременно, довольно низка.
Как вы ожидаете получить доступ к неинициализированному массиву?