2011-12-15 2 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 예외가 왜이 선이되는 배열

+0

newestHerbivore 배열 때문에 인덱스를 기반으로 값을 할당하는 그것은 라인에 15 –

+0

가 발생합니다, 비어 있습니다. –

답변

4

당신은 배열을 초기화 할 필요가있다. Java에서는 대신 Collections를 사용해야합니다. 대부분의 경우 ArrayLists는 배열 코드를 대체 할 수 있습니다. 그것은 초기화 선언하지만, 그래서 그것은`null`이 포함

+0

언급 한 내용을 사용하기 위해 어떻게 변경 하시겠습니까? –

+0

@ConnerRuhl [Collections Tutorial] (http://docs.oracle.com/javase/tutorial/collections/)을 읽어보십시오. –

2

newestHerbivore 배열을 초기화하지 않으므로 해당 요소에 할당하려고하면 NPE가 트리거됩니다.

newestCarnivore에 대해서도 마찬가지입니다.

나는 당신의 질문에 다음과 같은 문구가 혼란을 설명 할 수 생각 : 가 요소 ... 추가하고 당신이하지 이 요소를 추가, 기존 요소의 값을 변경 이야 . 귀하의 경우에는 배열 참조가 null이므로 요소가 존재하지 않습니다 (본질적으로 전체 배열은 존재하지 않습니다).

이 두 배열의 정확한 목적은 분명하지 않으므로이 문제를 해결하는 방법을 제안하는 것을 주저합니다. 내 추측 - 두 변수의 이름과 주석에 기초하여 배열보다는 스칼라 변수가되어야합니다.

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

가 BTW : 배열이 복잡하고 융통성있는 당신이 그것에 할당하기 전에

+0

의 하단에 오류 –

+0

@ConnerRuhl을 선언 코드 – NPE

+0

@ConnerRuhl 선언되었지만 초기화되지 않았습니다. –

관련 문제