0

我对是否需要进行数组初始化感到困惑......

对于此代码:

private int[][][] rPos = new int[SIZE][SIZE][2];

我可以以正确的方式开始使用数组吗,如下行?

getLocationOnScreen(rPos[i][j]); // pass an array of two integers

而且,对于这段代码:

View[][] allViews = new View[SIZE][SIZE];

然后我必须创建另一个嵌套循环,并View通过调用它们的构造函数来初始化每个循环,如下所示:

for (int i = 0; i < SIZE; i++) {
    for (int j = 0; j < SIZE; j++) {
        allViews[i][j] = new View(ctor1, ctor2);
    }
}

我的问题是,为什么我不需要对整数数组执行此操作?还有,当我键入时,我的“new”关键字做了什么View[][] allViews = new View[SIZE][SIZE];

4

1 回答 1

2

为什么我不需要对整数数组执行此操作?

每当您创建一个数组时,都会为数组元素分配该数组的组件类型的默认值。对于 an int,默认值为0,因此对于 an int[],默认情况下将所有元素初始化为0

但是,对于引用类型,默认值为null. NullPointerException因此,这些数组的问题在于,当您尝试访问这些数组元素中的某些属性或方法时,您可能会得到潜在的。基本上,对于引用数组,我们的意思是数组元素只不过是对实际对象的引用。最初它们不指向任何对象。

因此,要访问任何属性或方法,您必须将每个数组元素初始化为某个实例,以避免NPE.

当我输入时,我的“新”关键字做了什么View[][] allViews = new View[SIZE][SIZE];

它创建了一个数组数组,类型为View。维度是SIZE x SIZE。但是因为View不是原始类型,而是引用类型。如前所述,这些值默认null为 。

getLocationOnScreen(rPos[i][j]); // pass an array of two integers

当然,您传递了一个由 2 个整数组成的数组。的组件类型rPos[i][j]int[]. 默认值也是null如此。但在这种情况下,它不会是null,因为您也为所有内部数组提供了维度。

如果您将数组声明更改为:

private int[][][] rPos = new int[SIZE][SIZE][];  // Missing last dimension

那么 的值rPos[i][j]将是null

于 2013-09-24T16:15:48.427 回答