我正在尝试调试pickPlayers。列表“players”在添加“choice”后成功填充,但是当调用“isPlaying”时,它为null。
谁能明白为什么?我确保推送拾取的第一个元素,因此它实际上不应该是一个空的arraylist;一旦完成并且“正在播放”的话,我无法看到它在哪里清空玩家。
public abstract class Game {
protected ArrayList<Player> players;
public Game(String gameName, int numPlayers) {
this.name = gameName;
this.totalPlayers = numPlayers;
}
public void pickPlayers(ArrayList<Player> players, int num){
// rand int between 0 and number of players
Random generator = new Random();
int rand = generator.nextInt(num) + 0;
Player choice = null;
int i = 0;
// first player
for (Player player: players){
if (i == rand){
choice = player;
}
i++;
}
players.add(choice);
i=1;
while (i < num){
rand = generator.nextInt(num) + 0;
int a=0;
for (Player player: players){
if (a == rand){
choice = player;
System.out.println(choice.getName());
}
a++;
}
if (!isPlaying(choice)){
i++;
players.add(choice);
choice.play();
System.out.println(choice.getName());
}
}
}
public boolean isPlaying(Player p){
return players.contains(p);
}
}
答案 0 :(得分:0)
您要修改的arrayList是传递到Players
方法的pickPlayers
,并且是该方法的本地方法。
将此arrayList传递给isPLayer
或者不将arrayList传递给pickPlayers
答案 1 :(得分:0)
因为它们是不同的对象。在players
中操纵的pickPlayers
列表是一个参数,但isPlaying
中的Game
是{{1}}的成员。
答案 2 :(得分:0)
您正在从列表中选择随机播放器并添加到同一列表中。另外一件事是你在循环之外添加选择。
你也永远不会初始化
protected ArrayList<Player> players;
因此它始终为null,这是一个实例变量。当您致电pickPlayers()
时,函数players
是一个局部变量。
答案 3 :(得分:0)
您正在将玩家传递给pickPlayers(ArrayList<Player> players, int num)
这是不必要的,因为piclPlayers()与ArrayList玩家所在的同一个类。 ArrayList播放器是实例变量,它在整个类中都是可见的。因此,不要将数组列表播放器传递给同一类中的方法。
答案 4 :(得分:0)
你必须实例化ArrayList
你必须做player = new ArrayList();里面的pickPlayers方法。
之后你可以添加对象,否则它将显示NullPointerException。