方法中带有 ArrayList 的 NoSuchElementException
NoSuchElementException with ArrayList inside Method
我有一个 class 叫做“播放器”,应该
- 设置最大玩家数量并且
- 将玩家名称添加到 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
实例并且不要关闭它(根本不要关闭它,或者至少如果你知道你以后会需要它)。
我有一个 class 叫做“播放器”,应该
- 设置最大玩家数量并且
- 将玩家名称添加到 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
实例并且不要关闭它(根本不要关闭它,或者至少如果你知道你以后会需要它)。