Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取arraylist返回null_Java_Arraylist - Fatal编程技术网

Java 获取arraylist返回null

Java 获取arraylist返回null,java,arraylist,Java,Arraylist,我在arraylist中有一个关于小行星的游戏。为了保持代码整洁,我希望将此arraylist传递给不同的类/方法。我以为我已经弄明白了。。但显然不是。下面是: 我的Level1类以一个初始化方法(init)开始,该方法调用asteroid类中的populateAteroid方法。 Level1类还包含一个更新函数,该函数在asteroid arraylist中循环并更新它。所有这些都很好: public class Level1 { private Asteroid populate

我在arraylist中有一个关于小行星的游戏。为了保持代码整洁,我希望将此arraylist传递给不同的类/方法。我以为我已经弄明白了。。但显然不是。下面是: 我的Level1类以一个初始化方法(init)开始,该方法调用asteroid类中的populateAteroid方法。 Level1类还包含一个更新函数,该函数在asteroid 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;
    }   
}
公共类级别1{
私人小行星
私人碰撞;
公共void init(){
PopulateAteroid=新小行星();
//使用小行星对象创建并填充arraylist
populatesteroid.populatesteroid(1);
碰撞=新的碰撞();
} 
公共无效更新(){
//获取arraylist
ArrayList asteroidList=populateAsteroid.getAsteroidList();
对于(inti=0;i对于(int i=1+asteroidList.size();i您正在
Collision
类中创建一个全新的
Asteroid
,该类未初始化。您应该将以前初始化的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.

}

公共类冲突{
私人小行星a;
公共碰撞(小行星岩){
a=岩石;
//获取arraylist
ArrayList=a.getAsteroidList();
如果(列表==null){
System.out.println(“null”);}
}
…“更多代码”。。。。
checkCollision()
中,您正在创建一个全新的
小行星
对象。当创建
小行星
类的新实例时,将不会在其构造函数中创建列表。这就是为什么您会看到null

要使
checkCollision()
正常工作,它需要检查前面填充的相同
Asteroid
对象

您可以通过将先前创建的
小行星
对象像这样传递给它来实现这一点

public void checkCollision(Asteroid a){              
    ArrayList<Asteroid> asteroidList = a.getAsteroidList();

    if (asteroidList == null){
        System.out.println("null");}
    }
    ..."more code"....
}

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

a = new Asteroid();
a.populateAsteroid(someInteger)             
ArrayList<Asteroid> asteroidList = a.getAsteroidList();

您从未在
a
上调用
populateatesteroid
,因此列表从未创建。您从未填充小行星,因此其列表仍然为
null
。您是否打算使用您在
init()
方法中创建的列表,而不是在
checkCollision()中创建一个新的(空)列表
?您说的是
a=new Asteroid();
然后调用
a.getAsteroidList();
,这并不是初始化小行星列表。您可以将
小行星列表
设置为静态,或者创建另一个类,如管理小行星列表的
小行星处理程序
。然后需要将该处理程序实例传递给
检查碰撞
。在碰撞中,您创建了一个新的小行星对象,然后调用小行星列表的getter方法。与该全新对象关联的小行星列表从未设置为任何值,因此为空。这非常有意义,谢谢。我想要一个碰撞类的原因之一是我有多个包含不同对象(彗星、小行星、敌人等)的数组列表。如何将任意对象传递给check collision函数?早些时候,我在comet类、asteroid类等中有一个check collision方法,但我希望有一个方法可以涵盖所有对象。这就是为什么我认为我可以获得该方法来获取所需列表,而不是在调用该方法时将其传递给该方法。考虑一下-我想我只需将所有不同的数组列表同时传递给checkCollision方法,并同时检查它们,而无需为每个数组列表单独调用checkCollision方法。
public void checkCollision(Asteroid a){              
    ArrayList<Asteroid> asteroidList = a.getAsteroidList();

    if (asteroidList == null){
        System.out.println("null");}
    }
    ..."more code"....
}
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();
public ArrayList<Asteroid> asteroidList;
if (asteroidList == null){
    asteroidList = new ArrayList<Asteroid>();
}