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 是一个接收所有控制台输入的输入流。

就像任何输入流一样,它可以关闭。用户可以关闭它(通过按 ctrlDctrlZ),但您也可以通过编程方式关闭它 - 它是一个 Closeable 对象。

当你有一个基于输入流的扫描器时,当你关闭扫描器时,它也会自动关闭位于它后面的输入流。也就是说,到您第一次关闭 scn 时,您已经关闭了 System.in.

下次您在 System.in 上创建扫描器时,它基本上是一个封闭流上的扫描器。当您尝试调用任何 nextXXX 方法时,它会告诉您流中没有这样的元素。那是因为流已经关闭了。

您应该做的是只在程序开始时打开扫描仪一次,然后在程序结束时关闭它一次。您可以继续使用同一个扫描器——实际上不需要为同一个输入流打开多个扫描器。