【问题标题】:for each loop cannot initialize objects in array [duplicate]对于每个循环无法初始化数组中的对象[重复]
【发布时间】:2012-08-28 15:43:41
【问题描述】:

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

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讨论指出的那样,编译后两者应该相同。

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

【问题讨论】:

  • 如果您在 for 循环中使用 buffer.length 而不是重复 8 ,那么它将始终与您的数组大小正确。否则,如果您更改一个 8 而不是另一个,那么您将错过结束元素或得到一个数组超出范围异常。
  • 这只是为了举例。实际上,在 for 循环之前将 buffer.length 分配给变量并将其用于条件对于性能来说要好一些 - 几乎可以忽略不计 - 这是我的惯例。
  • 好吧,甚至还有一个关于优化的问题stackoverflow.com/questions/1208320/…

标签: java syntax for-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2011-02-03
        • 2019-09-18
        相关资源
        最近更新 更多