扫描程序 – java.util.NoSuchElementException

有没有人看到这个问题? 第一个输入工作正常,但在第一个循环后,它不会要求再次输入值。 我该如何解决?

int value; while(true) { Scanner scan = new Scanner(System.in); System.out.println("Enter a value"); try { value = scan.nextInt(); System.out.println("value provided is: " + value); scan.nextLine(); // consumes "\n" character in buffer } catch(InputMismatchException e) // outputs error message if value provided is not an integer { System.out.println("Incorrect input type. Try again."); continue; // restarts while loop to allow for re-entering of a valid input } scan.close(); } 

移动scan.close();while循环之外。

此外,您不必在每次迭代时构建新的 Scanner 。 将声明也移动到循环外部。


close 扫描程序时 ,将关闭System.in输入流。

所以现在当你尝试再次实例化它时,它找不到任何打开的流,你就会得到那个例外。

在while循环结束时,您已经编写了scan.close() 。 这将关闭扫描仪,防止进一步扫描。 删除该语句将确保您的while循环不断询问您的数字(在您的情况下将是一个无限循环)

此外, scan.nextInt()实际上忽略所有新行并等待,直到您实际输入一个数字并按Enter键。 因此,可以省略scan.nextLine() 。 只有在使用scan.nextLine()获取输入的值时才需要。 在这种情况下,新行字符也会被读取为输入,因此您需要额外的nextLine()调用来使用它。

当你执行scan.close() ,它会关闭底层的System.in流。 因此,在下一次迭代中,它将无法读取任何内容。

例如:

 import java.io.IOException; import java.util.InputMismatchException; import java.util.Scanner; public class Main { public static void main(String[] args) { int value; while (true) { Scanner scan = new Scanner(System.in); System.out.println("Enter a value"); try { value = scan.nextInt(); System.out.println("value provided is: " + value); scan.nextLine(); // consumes "\n" character in buffer } catch (InputMismatchException e) // outputs error message if value // provided is not an integer { System.out.println("Incorrect input type. Try again."); continue; // restarts while loop to allow for re-entering of a // valid input } scan.close(); try { int x = System.in.read(); System.out.println(x); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 

OUTPUT:

 Enter a value 10 value provided is: 10 Enter a value java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162) at java.io.BufferedInputStream.fill(BufferedInputStream.java:206) at java.io.BufferedInputStream.read(BufferedInputStream.java:254) at Main.main(Main.java:24) Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:907) at java.util.Scanner.next(Scanner.java:1530) at java.util.Scanner.nextInt(Scanner.java:2160) at java.util.Scanner.nextInt(Scanner.java:2119) at Main.main(Main.java:12) 

查看此问题了解更多信息:

如果我关闭底层可读文件,关闭Java扫描程序是否安全?