方法中带有 ArrayList 的 NoSuchElementException

NoSuchElementException with ArrayList inside Method

我有一个 class 叫做“播放器”,应该

  1. 设置最大玩家数量并且
  2. 将玩家名称添加到 ArrayList,

class 看起来像这样:

public class Player {

    private ArrayList<String> players = new ArrayList<String>();
    private int maxPlayers = 0;


    public ArrayList<String> setPlayers(ArrayList<String> strArrList) {

        Scanner sc = new Scanner(System.in);

        for (int i = 1; i <= getMaxPlayers(); i++) {

            System.out.print("Player #" + i + ": ");
            String name = sc.next();
            strArrList.add(name);
            System.out.println();

        }

        return strArrList;
    }

    public void setMaxPlayers() {

        Scanner sc = new Scanner(System.in);

        System.out.print("How many players? ");
        maxPlayers = sc.nextInt();
        System.out.println();

        sc.close();
    }

    public ArrayList<String> getPlayers() {

        return players;
    }

    public int getMaxPlayers() {

        return maxPlayers;
    }
}

我从我的 Main class 调用 Player class 方法,如下所示:

public class Main {

    public static void main(String[] args) {

        Player pl = new Player();

        pl.setMaxPlayers();
        pl.setPlayers(pl.getPlayers());
    }
}

但我得到以下输出:

How many players? 2

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at com.arsaii.drinkgame.Player.setPlayers(Player.java:18)
    at com.arsaii.drinkgame.Main.main(Main.java:10)

Process finished with exit code 1

我知道 NoSuchElementException 是什么意思(有点..)但我也尝试在不同的测试 class 中使用来自 Player class 的相同 for-loop一个主要方法并且它有效..这是否意味着我得到了一个 NoSuchElementException 因为它在一个方法中..有人可以解释一下吗..?

问题出在您的 setMaxPlayers() 方法中调用 sc.close() 时。这也将关闭底层 System.in 输入流。

由于 System.in 已关闭且无法重新打开,因此在您的 setPlayers() 中创建另一个 Scanner 包装 System.in 将失败。

所以最简单的解决方案,正如 here 所建议的那样,就是不关闭 Scanner 实例,如果它包装 System.in。只使用一个共享 Scanner 实例并且不要关闭它(根本不要关闭它,或者至少如果你知道你以后会需要它)。