对于每个循环都无法初始化数组中的对象

时间:2012-09-04 01:30:10

标签: java syntax for-loop

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

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;

正如this讨论指出的那样,编译后两者都应该相同。

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

3 个答案:

答案 0 :(得分:5)

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

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

查看Understanding for each loop in Java基本相同的问题。

答案 1 :(得分:5)

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

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

您没有将新的Vector分配给数组,而是将其分配给本地变量。

答案 2 :(得分:2)

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