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;
导致异常的元素?
答案 0 :(得分:4)
您需要在分配数组之前初始化数组:
herbivores = new Herbivore[herbivoreNumber];
newestHerbivore = new int[herbivoreNumber];
BTW:阵列很麻烦且不灵活。在Java中,您应该使用集合。在大多数情况下,ArrayLists可以替代数组代码。
答案 1 :(得分:2)
您永远不会初始化newestHerbivore
数组,因此尝试分配给它的元素会触发NPE。
newestCarnivore
同样如此。
我认为您问题中的以下措辞可能会解释混淆:为什么添加元素... 您不是添加元素,您更改现有元素的值。在你的情况下,元素不存在,因为数组引用是null
(实质上,整个数组都不存在)。
这两个阵列的确切目的尚不清楚,所以我对如何解决这个问题提出了建议。我的猜测 - 基于两个变量的名称和你的评论 - 将是它们应该是标量变量而不是数组。