2011-12-15 96 views
0
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; 
     }   
    } 
} 

为什么这一行:Java异常添加项目时,阵列

newestHerbivore[i] = 1; 

元素引起异常?

+0

newestHerbivore数组是空的,所以分配基于索引值会抛出错误 – 2011-12-15 16:54:01

+0

附近有一颗就行宣布15 – 2011-12-15 16:54:19

回答

4

需要初始化数组分配给它之前:

herbivores = new Herbivore[herbivoreNumber]; 
newestHerbivore = new int[herbivoreNumber]; 

BTW:数组是繁琐和僵化。在Java中,您应该使用集合来代替。在大多数情况下,ArrayLists可以很好地替代数组代码。

2

你永远不会初始化newestHerbivore数组,所以试图分配给它的元素触发一个NPE。

newestCarnivore也是如此。

我觉得你的问题如下措辞或许可以解释这样的困惑:为什么添加元素...你是不是加入元素,你是改变现有元素的值 。在你的情况下,该元素不存在,因为数组引用是null(本质上,整个数组不存在)。

这两个数组的确切目的不明确,所以我不愿提供一个关于如何解决这个问题的建议。我的猜测 - 基于这两个变量的名称和你的评论 - 应该是它们应该是标量变量而不是数组。

+0

的底部:它的声明,但没有初始化,使其包含`null`。 – 2011-12-15 16:54:58