[英]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.