获取arraylist返回null

时间:2016-09-02 20:35:57

标签: java arraylist

我在一个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"....

列表为空,即使我相信我正在检索arraylist与我在Level1.update函数中的方式相同。 是因为arraylist是因为它是从Level1类中的调用创建的而不可见的?有什么建议?

3 个答案:

答案 0 :(得分:3)

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)
}

答案 1 :(得分:2)

您没有填写小行星列表。您正在实例化一个新类,但没有执行填充列表所需的方法:

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>();
}

答案 2 :(得分:1)

您正在Asteroid课程中创建一个全新的Collision,一个未初始化的课程。您应该将先前初始化的小行星的实例传入类中。

例如:

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"....