我正在尝试调试pickPlayers。 列表"玩家"在添加"选择"后成功填充,但当调用"isPlaying"时,它是空的。
谁能明白为什么?我确保推送选择的第一个元素,因此它实际上不应该是一个空数组列表;一旦完成并调用"正在播放",我就看不到它在哪里清空玩家。
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);
}
}
您正在从列表中选择随机玩家并添加到同一列表中。另一件事是您在循环之外添加选择。
此外,您永远不会初始化
protected ArrayList<Player> players;
因此,它始终为 null,这是一个实例变量。调用pickPlayers()
函数时players
是一个局部变量。
您正在修改的 arrayList 是传递到 pickPlayers
方法的Players
,并且是该方法的本地。
要么将此数组列表传递给isPLayer
,要么不将数组列表传递给pickPlayers
是不同的对象。 pickPlayers
中纵的players
列表是一个参数,但isPlaying
中的列表是Game
的成员。
您将播放器传递给pickPlayers(ArrayList<Player> players, int num)
这不是必需的,因为 piclPlayers() 位于存在 ArrayList 播放器的同一类中。ArrayList 播放器是实例变量,在整个类中可见。因此,不要将数组列表播放器传递给同一类中的方法。
你必须实例化ArrayList。
你必须做播放器 = 新的数组列表();在选择玩家方法中。
之后,您可以添加对象,否则它将显示NullPointerException。