我试图创建一个非常简单的程序(这不重要,但是一个Minesweeper游戏),我遇到了以下问题:当我尝试获取用户输入(使用Scanner
)时,它可以工作第一次(第一次转弯),但是在第二次转弯时,按输入后,它会抛出以下异常: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();
//...
}
同样,它在我第一次调用此方法时有效,但在第二次调用时失败。你知道问题可能是什么吗?
答案 0 :(得分:5)
System.in
是一个输入流,它接收所有控制台输入。
就像任何输入流一样,它可以被关闭。用户可以关闭它(通过按 ctrl D 或 ctrl Z ),但您也可以通过编程方式关闭它 - 它是Closeable
对象。
当您拥有基于输入流的扫描仪并关闭扫描仪时,它会自动关闭位于其后面的输入流。也就是说,当您第一次关闭scn
时,您已关闭System.in
。
下次在System.in
上创建扫描仪时,它基本上是一个封闭流上的扫描仪。当您尝试调用任何nextXXX
方法时,它会告诉您流中没有此类元素。那是因为流已经关闭了。
您应该做的只是在程序开头只打开一次扫描仪,并在程序结束时关闭它一次。您可以继续使用相同的扫描仪 - 实际上不需要为同一输入流打开多个扫描仪。