Java for each循环无法初始化数组中的对象

Java for each循环无法初始化数组中的对象,java,syntax,for-loop,Java,Syntax,For Loop,我将迅速着手解决这个问题。我有一门直截了当的课 class Vector{ float x, y; } 另一个类的成员是这些对象的数组 Vector[] buffer; 我这样初始化它: buffer = new Vector[8]; for(Vector v: buffer) v = new Vector(); 但是当我试图访问这个数组中这个对象的成员时,我会得到一个直接指向堆栈跟踪的NullPointerException。也就是说,尚未构造数组的对象。另一方面,这种更

我将迅速着手解决这个问题。我有一门直截了当的课

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;
buffer=新向量[8];

for(int i=0;i在您的for each示例中,您正在覆盖循环的局部变量,该变量不会保存回数组中。这类似于第二个循环:

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

检查基本上相同的问题。

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

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

您没有将新的
向量
分配给数组,而是将其分配给一个局部变量。

在第一个示例中,
v
仅在for循环中可用。当您这样做时,
v=new Vector();
v被更新,但不是buffer[i]。v指向buffer[i]之前,它指向一个新的向量,
buffer[i]
保持为
null

如果在for循环中使用buffer.length而不是重复8,则它将始终与数组大小正确匹配。否则,如果更改其中一个8而不是另一个8,则将丢失结束元素或得到一个数组越界异常。这只是为了示例。实际分配缓冲区。在for循环之前将变量的长度指定为一个变量,并将其用于条件,这对性能来说有点更好—几乎可以忽略不计—这是我的惯例。甚至还有一个关于这种优化的问题