当方法调用另一个方法时,ArrayList是否为空?

时间:2014-02-26 05:47:45

标签: java arraylist null

我正在尝试调试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);
}
}

5 个答案:

答案 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。