2013-12-07 4 views
0

플랜트 배열 목록에 대한 딥 복사본을 만들려고 할 때 어떤 이유로 든 null 포인터 예외가 발생하며 그 이유를 알 수 없습니다.<Fish> arrayList 딥 복사

/** 
* Copy Constructor. Since landscape is immutable in the scope of our 
* project, you could do a simple reference copy for it. However, Fish and 
* Plants are mutable, so those lists must be copied with a DEEP copy! (In 
* other words, each fish and each plant must be copied.) 
*/ 



private ArrayList<Fish> fish; 
private ArrayList<Plant> plants; 
private int[][] landscape; 

public Model(Model other) { 
    this.landscape = other.landscape; 

    for(Fish fishy: other.fish){ 
     this.fish.add(new Fish(fishy)); 
    } 

    for(Plant planty: other.plants){ 
     this.plants.add(new Plant(planty)); 
    } 
} 
+0

생성자를 붙여 넣을 수 있습니까? –

답변

3

당신은 초기화되지 않은 물고기와 식물

public Model(Model other) { 
    fish = new ArrayList<Fish>(); 
    plants = new ArrayList<Plant>(); 
    this.landscape = other.landscape; 

    for(Fish fishy: other.fish){ 
     this.fish.add(new Fish(fishy)); 
    } 

    for(Plant planty: other.plants){ 
     this.plants.add(new Plant(planty)); 
    } 
} 
+1

고마워요. – user3011240

+0

환영합니다. 다른 답변도 확인해보십시오. – 4J41

1

당신은 당신의 배열을 초기화해야합니다

public Model(Model other) { 
    this.landscape = other.landscape; 
    this.fish = new ArrayList<Fish>(); 
    this.plants = new ArrayList<Plants>(); 

    if (other.fish != null) { 
     for (Fish myFish : other.fish) { 
       this.fish.add(new Fish(myFish)); 
     } 
    } 
    if (other.plants != null) { 
     for (Plant myPlant : other.plants) { 
       this.plants.add(new Plant(myPlant)); 
     } 
    } 

} 

는 또한,이 other.fish가 null인지 여부를 기회로 중요합니다. 귀하의 경우, 당신은 null 목록에 대한 반복자 시도를 끝낼 수 있습니다.

1

stacktrace를 보지 않고도 잘 모르겠지만 Model 개체가 생성되면 ArrayLists로 초기화 했습니까?

:

public Model() { 
    fish = new ArrayList<Fish>(); 
    plants = new ArrayList<Plant>(); 
}