2013-05-08 126 views
0

我在循环访问类中的对象时遇到了一些问题。我在这里写了一个小小的演示,所以你可以按照下列步骤操作:循环遍历类中的对象数组

Tank tanks[] = new Tank[2]; 
tanks[0] = new Tank(); 
tanks[1] = new Tank(); 
tanks[0].doStuff(tanks); 

doStuff(Tank[] tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
     if (tanks[i].equals(this)) continue; 
     // Do stuff 
    } 
} 

所以,我有一个类型为Tank的数组。然后我调用Tank类中的doStuff方法。该方法获取数组并循环遍历它。然后我想为每个坦克都做些东西,而不是这个班的当前实例。我希望你能从我的代码和这个描述中理解。

的问题是,我得到的NullPointerException为if (tanks[i].equals(this))

我在做什么错在这里?

+2

该代码无论如何都不会编译,因为你试图把一个单一值('坦克tanks' )作为一个数组。请修改您的问题以提供一个简短的*完整*程序来展示问题。 – 2013-05-08 15:45:25

+0

你有没有重新实现equals方法?如果是,你可以展示它吗?这是我认为这个null可能来自的唯一的地方,但只有当你重新实现它并做了错误的时候。其余的都很干净。 – 2013-05-08 15:46:21

+0

@JonSkeet你可以使用该语法来创建一个数组。这很奇怪,但他将其声明为变量名称中的数组。 – 2013-05-08 15:48:04

回答

8

这意味着tanks[i]为空。 (或者您的覆盖equals()方法有bug)

您需要检查。

+2

更可能后者,由于相对基本所提供的代码的性质。 – 2013-05-08 15:45:18

+2

@AnthonyGrist:鉴于所提供的代码无法编译(即使在被静默编辑之后),我强烈怀疑它并不代表正在运行的真实代码。 – 2013-05-08 15:50:21

1

当我运行这段代码:

public class Tank { 
    public static void main(String[] args) { 
    Tank tanks[] = new Tank[2]; 
    tanks[0] = new Tank(); 
    tanks[1] = new Tank(); 
    tanks[0].doStuff(tanks); 
    } 

    public void doStuff(Tank[] tanks) { 
     for (int i = 0; i < tanks.length; i++) { 
      if (tanks[i].equals(this)) continue; 
      // Do stuff 
     } 
    } 
} 

没有错误发生。因此,您可能会覆盖.equals,这就是NullPointerException发生的位置。另一种可能性是你的简单示例不能准确地反映你的bug发生的地方。

1

,如果你想比较你的对象的ID,您可以使用==代替.equals()

doStuff(Tank tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
    if (tanks[i] == this) { 
     continue; 
     } 
    // Do stuff 
    } 
}