java.util.NoSuchElementException:未找到行 - 读取用户输入仅有效一次
java.util.NoSuchElementException: No line found - Reading user input works only once
我试图创建一个非常简单的程序(没关系,但扫雷游戏),但我遇到了以下问题:当我尝试获取用户输入时(使用 Scanner
),它第一次工作(在第一轮),但在第二轮,按 enter 后,它抛出以下异常:java.util.NoSuchElementException: No line found
.
两回合之间没有任何变化,我在每一回合都创建了一个新的 Scanner
实例。
代码:
public String nextTurn() {
Scanner scn = new Scanner(System.in);
System.out.print("Please insert your action: ");
StringTokenizer input = new StringTokenizer(scn.nextLine());
scn.close();
//...
}
同样,当我第一次调用这个方法时它有效,但在第二次调用时失败了。您知道问题出在哪里吗?
System.in
是一个接收所有控制台输入的输入流。
就像任何输入流一样,它可以关闭。用户可以关闭它(通过按 ctrlD 或 ctrlZ),但您也可以通过编程方式关闭它 - 它是一个 Closeable
对象。
当你有一个基于输入流的扫描器时,当你关闭扫描器时,它也会自动关闭位于它后面的输入流。也就是说,到您第一次关闭 scn
时,您已经关闭了 System.in
.
下次您在 System.in
上创建扫描器时,它基本上是一个封闭流上的扫描器。当您尝试调用任何 nextXXX
方法时,它会告诉您流中没有这样的元素。那是因为流已经关闭了。
您应该做的是只在程序开始时打开扫描仪一次,然后在程序结束时关闭它一次。您可以继续使用同一个扫描器——实际上不需要为同一个输入流打开多个扫描器。
我试图创建一个非常简单的程序(没关系,但扫雷游戏),但我遇到了以下问题:当我尝试获取用户输入时(使用 Scanner
),它第一次工作(在第一轮),但在第二轮,按 enter 后,它抛出以下异常:java.util.NoSuchElementException: No line found
.
两回合之间没有任何变化,我在每一回合都创建了一个新的 Scanner
实例。
代码:
public String nextTurn() {
Scanner scn = new Scanner(System.in);
System.out.print("Please insert your action: ");
StringTokenizer input = new StringTokenizer(scn.nextLine());
scn.close();
//...
}
同样,当我第一次调用这个方法时它有效,但在第二次调用时失败了。您知道问题出在哪里吗?
System.in
是一个接收所有控制台输入的输入流。
就像任何输入流一样,它可以关闭。用户可以关闭它(通过按 ctrlD 或 ctrlZ),但您也可以通过编程方式关闭它 - 它是一个 Closeable
对象。
当你有一个基于输入流的扫描器时,当你关闭扫描器时,它也会自动关闭位于它后面的输入流。也就是说,到您第一次关闭 scn
时,您已经关闭了 System.in
.
下次您在 System.in
上创建扫描器时,它基本上是一个封闭流上的扫描器。当您尝试调用任何 nextXXX
方法时,它会告诉您流中没有这样的元素。那是因为流已经关闭了。
您应该做的是只在程序开始时打开扫描仪一次,然后在程序结束时关闭它一次。您可以继续使用同一个扫描器——实际上不需要为同一个输入流打开多个扫描器。