我有一个函数正在被调用,我希望它继续循环,但是当我接受一个输入来继续运行时,我会得到以下错误:
Exception in thread "main"
java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at SticksGame.main(SticksGame.java:144)我假设这是由于我正在使用的扫描仪,但我不知道为什么当关闭代码中的两个扫描器时,我会遇到问题。我试图删除其中一个扫描器关闭,但我的代码无限循环,并要求相同的输入。
public void begin() {
while (this.numOfSticks > 0) {
if (player == 1) {
doNextTurn(this.player);
} else if (player == 2 && !isAgainstAi) {
doNextTurn(this.player);
} else {
doAiNextTurn();
}
if (this.numOfSticks <= 0) {
if (this.player == 1 && isAgainstAi) {
// AI won
incrementHats(true);
}
if (this.player == 2 && isAgainstAi) {
System.out.println("AI loses.");
// AI loses
incrementHats(false);
// System.out.print("Play again (1 = yes, 0 = no)? ");
// int pA = scanner.nextInt();
// printHats();
} else {
String message = String.format("Player %s: you lose.", this.player);
System.out.println(message);
// printHats();
}
scanner.close();
return;
}
this.togglePlayer();
// printHats();
}
}
public static void main(String[] args) {
SticksGame game = new SticksGame();
Scanner s = new Scanner(System.in);
game.begin();
while (true) {
System.out.println("Play again (1 = yes, 0 = no)? ");
if (s.next().equals("1")) {
game.begin();
} else {
s.close();
System.exit(1);
}
}
}发布于 2022-04-25 18:28:13
在scanner方法中没有像begin()这样的东西。如果您要在main中关闭它,则不必关闭它。
发布于 2022-04-25 18:38:03
来自JavaDoc of Scanner.close():“如果这个扫描器还没有关闭,那么如果它的底层可读也实现了关闭接口,那么这个可读的关闭方法将被调用。”
由于System.in是一个实现Closeable接口的InputStream,关闭扫描仪也会关闭System.in流,从而影响到其他扫描仪。如果您再次尝试使用它,您将得到一个NoSuchElementException。
发布于 2022-04-25 18:39:22
Scanner.close()将关闭扫描器本身以及任何可关闭的底层对象。而且,由于System.in是由JVM内部管理的,因此一旦关闭它,就无法重新打开它。您应该尽量避免关闭任何包装System.in的扫描器。
https://stackoverflow.com/questions/72004038
复制相似问题