[英]Getting arraylist returns null
我有一個游戲,其中的一些小行星對象位於arraylist中。 為了使我的代碼簡潔明了,我想將此arraylist傳遞給不同的類/方法。 我以為我已經弄明白了..但顯然不是。 我的Level1類從初始化方法(init)開始,該方法調用小行星類中的populateAsteroid方法。 Level1類還包含一個更新函數,該函數循環遍歷小行星arraylist並對其進行更新。 所有這些工作正常:
public class Level1 {
private Asteroid populateAsteroid
private Collision collision;
public void init() {
populateAsteroid = new Asteroid();
// create and populate an arraylist with asteroid objects
populateAsteroid.populateAsteroid(1);
collision = new Collision();
}
public void update() {
// get the arraylist
ArrayList<Asteroid> asteroidList = populateAsteroid.getAsteroidList();
for(int i = 0; i < asteroidList.size(); i++) {
Asteroid a = asteroidList.get(i);
a.update(i);
}
collision.checkCollision();
}
}
public class Asteroid {
public ArrayList<Asteroid> asteroidList;
public void populateAsteroid(int level) {
// if the arraylist is null, as when the function is called by init, create the array
if (asteroidList == null){
asteroidList = new ArrayList<Asteroid>();
}
for (int i = 1 + asteroidList.size(); i <= (asteroidsAtEachLevel[level]); i++){
Asteroid a = new Asteroid();
asteroidList.add(a);
}
}
public ArrayList<Asteroid> getAsteroidList() {
return asteroidList;
}
}
但是,麻煩出在我的碰撞類中,該碰撞類由Level1類中的update函數調用,該類包含checkCollision方法
public class Collision {
private Asteroid a;
public void checkCollision(){
a = new Asteroid();
// get the arraylist
ArrayList<Asteroid> asteroidList = a.getAsteroidList();
if (asteroidList == null){
System.out.println("null");}
}
..."more code"....
該列表為null,即使我相信我要以與Level1.update函數中執行的方式相同的方式檢索arraylist。 是因為arraylist在Level1類的調用中創建時不怎么可見? 有什么建議么?
在checkCollision()
您將創建一個全新的Asteroid
對象。 制作Asteroid
類的新實例時,不會在其構造函數中創建List。 這就是為什么您看到null的原因。
為了使checkCollision()
正常工作,它需要檢查先前填充的同一Asteroid
對象。
您可以通過將之前制作的Asteroid
對象傳遞給它來實現
public void checkCollision(Asteroid a){
ArrayList<Asteroid> asteroidList = a.getAsteroidList();
if (asteroidList == null){
System.out.println("null");}
}
..."more code"....
}
然后修改您的init()
方法
public void init() {
populateAsteroid = new Asteroid();
populateAsteroid.populateAsteroid(1);
collision = new Collision();
collision.checkCollision(populateAsteroid)
}
您沒有填充小行星列表。 您正在實例化一個新類,但沒有執行所需的方法來填充列表:
a = new Asteroid();
a.populateAsteroid(someInteger)
ArrayList<Asteroid> asteroidList = a.getAsteroidList();
創建Asteroid類對象時,僅聲明該列表。 您沒有為其分配值:
public ArrayList<Asteroid> asteroidList;
直到populateAsteroid
方法創建新的ArrayList實例。 如果將其留給聲明,它將返回null。 這就是以下if條件始終返回true的原因:
if (asteroidList == null){
asteroidList = new ArrayList<Asteroid>();
}
您正在Collision
類中創建一個全新的Asteroid
,尚未初始化。 相反,您應該將先前初始化的小行星的實例傳遞給該類。
例如:
public class Level1 {
private Asteroid populateAsteroid
private Collision collision;
public void init() {
populateAsteroid = new Asteroid();
// create and populate an arraylist with asteroid objects
populateAsteroid.populateAsteroid(1);
collision = new Collision(populateAsteroid); //Pass in the reference to the asteroid.
}
和
public class Collision {
private Asteroid a;
public void checkCollision(Asteroid rock){
a = rock;
// get the arraylist
ArrayList<Asteroid> asteroidList = a.getAsteroidList();
if (asteroidList == null){
System.out.println("null");}
}
..."more code"....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.