为什么我需要初始化这个成员数组

时间:2018-05-01 14:25:13

标签: java nullpointerexception

如果我没有初始化这个成员数组' arryMem'具有相同的预期长度,我得到nullPointerException,但初始化它工作,帮助让我理解这个PLZ。

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 :(得分:4)

因为在尝试填充数组之前必须指定数组的长度。

您可以在BubRec构造函数中使用arryMem = new Integer[ary.length];来执行此操作:

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;
    }

    // ...

}

答案 1 :(得分:2)

当您编写Integer arryMem [] = {0,0,0,0,0,0,0};时,java会分配一个长度为 7 的数组,因为您插入了七个元素。或者,您可以通过键入Integer arryMem [] = new Integer [7]来分配相同长度的数组。如果直接插入值,java会自动为您执行此操作。

现在问题是当你输入Integer arrayMem [];时,没有人分配任何内存nether java,因为你没有插入任何值,也没有。因此,如果在此数组中调用元素,则会得到 NullPointerException ,因为没有任何元素...

所以你必须分配内存(创建对象),然后才能使用它。您可以通过多种方式看到它。您可以通过键入...

一步完成并初始化所有元素
this.arryMem = Arrays.copyOf(ary, ary.length);

...在你的构造函数中。