向数组添加项时的Java异常

时间:2011-12-15 16:51:28

标签: java arrays

package survival;

public class World {
    private int width;
    private int height;

    private int distancePenalty = 2;
    private int turnPenalty = 4;
    private double hungerPenalty = 0.1;

    private Plant[] plants;
    private Herbivore[] herbivores;
    private Carnivore[] carnivores;

    private int[] newestHerbivore;
    private int[] newestCarnivore;

    public World(int plantNumber, int herbivoreNumber, int carnivoreNumber, int width, int height) {
        this.width = width;
        this.height = height;

        plants = new Plant[plantNumber];
        for (int i = 0; i < plantNumber; i++) {
            plants[i] = new Plant(Math.random() * width, Math.random() * height);
        }        
        herbivores = new Herbivore[herbivoreNumber];
        for (int i = 0; i < herbivoreNumber; i++) {
            herbivores[i] = new Herbivore(Math.random() * width, Math.random() * height);

            //////////// This line causes java.lang.NullPointerException
            newestHerbivore[i] = 1;
        }
        carnivores = new Carnivore[carnivoreNumber];
        for (int i = 0; i < carnivoreNumber; i++) {

            //////////// This line causes java.lang.NullPointerException
            newestCarnivore[i] = 1;
        }        
    }
}

为什么这一行:

newestHerbivore[i] = 1;

导致异常的元素?

2 个答案:

答案 0 :(得分:4)

您需要在分配数组之前初始化数组:

herbivores = new Herbivore[herbivoreNumber];
newestHerbivore = new int[herbivoreNumber];
BTW:阵列很麻烦且不灵活。在Java中,您应该使用集合。在大多数情况下,ArrayLists可以替代数组代码。

答案 1 :(得分:2)

您永远不会初始化newestHerbivore数组,因此尝试分配给它的元素会触发NPE。

newestCarnivore同样如此。

我认为您问题中的以下措辞可能会解释混淆:为什么添加元素... 您不是添加元素,您更改现有元素的值。在你的情况下,元素不存在,因为数组引用是null(实质上,整个数组都不存在)。

这两个阵列的确切目的尚不清楚,所以我对如何解决这个问题提出了建议。我的猜测 - 基于两个变量的名称和你的评论 - 将是它们应该是标量变量而不是数组。