当方法调用另一个方法时,数组列表为空



我正在尝试调试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。

相关内容

  • 没有找到相关文章

最新更新