java.util.NoSuchElementException:找不到行 - 读取用户输入只能工作一次

Or *_*evo 2 java java.util.scanner

我试图创建一个非常简单的程序(这不重要,但是一个扫雷游戏),我遇到了以下问题:当我尝试获取用户输入(带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();
    //...
}
Run Code Online (Sandbox Code Playgroud)

同样,它在我第一次调用此方法时有效,但在第二次调用时失败.你知道问题可能是什么吗?

Rea*_*tic 5

System.in 是一个输入流,它接收所有控制台输入.

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

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

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

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