8

我会快速解决这个问题。我有一个简单的课程

class Vector{
    float x, y;
}

另一个类将这些对象的数组作为其成员

Vector[] buffer;

我这样初始化它:

buffer = new Vector[8];
for(Vector v: buffer)
    v = new Vector();

但是当我尝试访问这个数组中的这个对象的成员时,我会直接得到一个 NullPointerException 到我的堆栈跟踪。也就是说,数组的对象还没有被构造。另一方面,这个更传统的代码非常完美:

buffer = new Vector[8];
for(int i = 0; i<8; i++)
    buffer[i] = new Vector;

正如这个讨论所指出的,编译后两者应该是相同的。

我的问题是,为什么对于每个循环都无法从项目数组初始化/构造对象?

4

3 回答 3

5

在您的 for-each 示例中,您正在覆盖不会保存回数组的循环的局部变量。它类似于您的第二个循环:

for(int i = 0; i < buffer.length; i++){
    Vector v = buffer[i];
    v = new Vector();
}

查看对 Java 中每个循环的理解,了解基本相同的问题。

于 2012-09-04T01:32:50.463 回答
5

两个循环都用于访问数组中的元素,但不用于初始化它们。当您在这种情况下使用 for-each 循环时,就像在做

for(int x = 0; x < array.length; x++) {
    Vector v = array[x];
    v = new Vector();
}

您没有将 new 分配给Vector数组,而是将其分配给局部变量。

于 2012-09-04T01:34:21.847 回答
2

在您的第一个示例中,v仅在 for 循环内可用。当你v = new Vector();更新 v 时,而不是缓冲区 [i]。v 之前指向 buffer[i],现在它指向一个新向量,buffer[i]仍然为null.

于 2012-09-04T01:49:35.627 回答