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



如果我不以相同的预期长度初始化这个成员数组'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

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

您可以通过在 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;
    }
    // ...
}

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

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

因此,必须先分配内存(创建对象(,然后才能使用它。您可以通过多种方式完成此操作。您可以执行此操作并通过键入一个步骤初始化所有元素...

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

。在您的构造函数中。

最新更新