什么是 java.util.NoSuchElementException 以及如何修复它?
What is java.util.NoSuchElementException and how do i fix it?
我试图编写一个战舰游戏,我 运行 在提示用户输入他们的猜测坐标时出现此错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at game.User.takeTurn(User.java:121)
at game.Game.main(Game.java:61)
这里是发生错误的方法User.takeTurn():
static void takeTurn() {
System.out.println("Yout turn!");
System.out.println("Enter your x guess:");
Scanner scanInput = new Scanner(System.in);
int x;
x = scanInput.nextInt();
System.out.println("You entered "+ x + ", Now enter your y coord:");
int y;
y = scanInput.nextInt();
System.out.println("You entered + " + y);
if(Board.aiBoard[x][y] == 2) {
System.out.println("Hit! You got a hit at: " + x + "," + y);
Board.enemyBoardDisplay[x][y] = 'h';
Board.aiBoard[x][y] = 3;
}
else {
System.out.println("Miss!");
Board.enemyBoardDisplay[x][y] = 'x';
Board.aiBoard[x][y] = 1;
}
scanInput.close();
}
我不太确定它是否重要,但我之前在 class 中也使用过另一个扫描仪。如果您需要更多代码来帮助,请告诉我。谢谢!
编辑 1:
好的,即使在我执行 scanInput.hasNextInt() 之后它也不起作用。我还放入了一个给 x 赋值的 else 语句,但现在 x 始终具有 else 语句赋予的值。它甚至不要求输入它只是默认为该值。但我不希望它变成默认值,我希望用户选择。
编辑 2:这是我在主存根中调用代码的地方
while (gameOn == true) {
if (turn == 0) {
User.takeTurn();
Board.sunkCheck();
if (gameOn == false)
break;
}
else if (turn == 1) {
Computer.takeTurn();
Board.sunkCheck();
if (gameOn == false)
break;
}
这是我之前使用扫描仪的地方,class 我现在尝试使用扫描仪:
System.out
.println("\n Please enter the first x value for your ship (Note, this will be the first point, from this point the \n"
+ " ship can either go vertically downward or horizontally to the right so please choose the topmost point or leftmost \n"
+ "point to do this. Also, the board is 10x10 but due to java array indexing the coordinates go x 0-9 y 0-9: ");
try {
Scanner coord = new Scanner(System.in);
userX = coord.nextInt();
System.out.println("You entered: " + userX);
System.out.println("Now enter the y coordinate for this point: ");
userY = coord.nextInt();
System.out.println("You entered: " + userY);
System.out
.println("Please choose the direction of your ship. Enter v for verticle or h for horizontal(case sensitive): ");
dir = (char) System.in.read();
coord.close();
}
catch(InputMismatchException e) {
System.out.println("Good job doof, since you tried to troll we did all the values for you!");
userX = 3;
userY = 3;
dir = 'v';
}
NoSuchElementException 当您尝试从扫描仪读取输入并且输入不存在时发生。
所以在接受输入之前,您应该检查扫描仪是否有一些输入供您使用,例如:
if (scanInput.hasNextInt()) {
x = scanInput.nextInt();
}
您可能需要先检查 next
元素,然后再将其放入 Scanner
和 scanInput.hasNextInt()
。
更新:
如果你使用上面的 Scanner coord = new Scanner(System.in);
然后用 Scanner scanInput = new Scanner(System.in);
调用函数而不关闭 coord
Scanner
,那么你会遇到问题。
Scanners will continue to consume the stream - this may (will) lead to
unexpected side-effects.
您可能希望在使用另一个之前关闭第一个 (here for more ref)。
更新:
当您关闭 coord.close()
时,您将关闭 System.in
,当您尝试重新读取它时,它会抛出异常。
不必在每次需要输入时都重新打开流,您可以创建 Scanner
一次并重新使用它。
我试图编写一个战舰游戏,我 运行 在提示用户输入他们的猜测坐标时出现此错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at game.User.takeTurn(User.java:121)
at game.Game.main(Game.java:61)
这里是发生错误的方法User.takeTurn():
static void takeTurn() {
System.out.println("Yout turn!");
System.out.println("Enter your x guess:");
Scanner scanInput = new Scanner(System.in);
int x;
x = scanInput.nextInt();
System.out.println("You entered "+ x + ", Now enter your y coord:");
int y;
y = scanInput.nextInt();
System.out.println("You entered + " + y);
if(Board.aiBoard[x][y] == 2) {
System.out.println("Hit! You got a hit at: " + x + "," + y);
Board.enemyBoardDisplay[x][y] = 'h';
Board.aiBoard[x][y] = 3;
}
else {
System.out.println("Miss!");
Board.enemyBoardDisplay[x][y] = 'x';
Board.aiBoard[x][y] = 1;
}
scanInput.close();
}
我不太确定它是否重要,但我之前在 class 中也使用过另一个扫描仪。如果您需要更多代码来帮助,请告诉我。谢谢!
编辑 1: 好的,即使在我执行 scanInput.hasNextInt() 之后它也不起作用。我还放入了一个给 x 赋值的 else 语句,但现在 x 始终具有 else 语句赋予的值。它甚至不要求输入它只是默认为该值。但我不希望它变成默认值,我希望用户选择。
编辑 2:这是我在主存根中调用代码的地方
while (gameOn == true) {
if (turn == 0) {
User.takeTurn();
Board.sunkCheck();
if (gameOn == false)
break;
}
else if (turn == 1) {
Computer.takeTurn();
Board.sunkCheck();
if (gameOn == false)
break;
}
这是我之前使用扫描仪的地方,class 我现在尝试使用扫描仪:
System.out
.println("\n Please enter the first x value for your ship (Note, this will be the first point, from this point the \n"
+ " ship can either go vertically downward or horizontally to the right so please choose the topmost point or leftmost \n"
+ "point to do this. Also, the board is 10x10 but due to java array indexing the coordinates go x 0-9 y 0-9: ");
try {
Scanner coord = new Scanner(System.in);
userX = coord.nextInt();
System.out.println("You entered: " + userX);
System.out.println("Now enter the y coordinate for this point: ");
userY = coord.nextInt();
System.out.println("You entered: " + userY);
System.out
.println("Please choose the direction of your ship. Enter v for verticle or h for horizontal(case sensitive): ");
dir = (char) System.in.read();
coord.close();
}
catch(InputMismatchException e) {
System.out.println("Good job doof, since you tried to troll we did all the values for you!");
userX = 3;
userY = 3;
dir = 'v';
}
NoSuchElementException 当您尝试从扫描仪读取输入并且输入不存在时发生。
所以在接受输入之前,您应该检查扫描仪是否有一些输入供您使用,例如:
if (scanInput.hasNextInt()) {
x = scanInput.nextInt();
}
您可能需要先检查 next
元素,然后再将其放入 Scanner
和 scanInput.hasNextInt()
。
更新:
如果你使用上面的 Scanner coord = new Scanner(System.in);
然后用 Scanner scanInput = new Scanner(System.in);
调用函数而不关闭 coord
Scanner
,那么你会遇到问题。
Scanners will continue to consume the stream - this may (will) lead to unexpected side-effects.
您可能希望在使用另一个之前关闭第一个 (here for more ref)。
更新:
当您关闭 coord.close()
时,您将关闭 System.in
,当您尝试重新读取它时,它会抛出异常。
不必在每次需要输入时都重新打开流,您可以创建 Scanner
一次并重新使用它。