java.util.NoSuchElementException:找不到行-读取用户输入只工作一次
我试图创建一个非常简单的程序(这不重要,但只是一个扫雷游戏),但我遇到了以下问题:当我尝试获取用户输入时(使用java.util.NoSuchElementException:找不到行-读取用户输入只工作一次,java,java.util.scanner,Java,Java.util.scanner,我试图创建一个非常简单的程序(这不重要,但只是一个扫雷游戏),但我遇到了以下问题:当我尝试获取用户输入时(使用扫描仪),它第一次工作(在第一个回合),但在第二个回合,按enter键后,它引发以下异常:java.util.NoSuchElementException:未找到任何行 在这两个回合之间没有任何变化,我在每一回合都创建一个新的Scanner实例 守则: public String nextTurn() { Scanner scn = new Scanner(System.in);
扫描仪
),它第一次工作(在第一个回合),但在第二个回合,按enter键后,它引发以下异常:java.util.NoSuchElementException:未找到任何行
在这两个回合之间没有任何变化,我在每一回合都创建一个新的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();
//...
}
同样,当我第一次调用此方法时,它可以工作,但在第二次调用时失败。您知道问题可能是什么吗?
系统中的输入流接收所有控制台输入
就像任何输入流一样,它可以关闭。用户可以关闭它(通过按ctrlD或ctrlZ),但您也可以通过编程方式关闭它-它是一个可关闭的
对象
当您有一个基于输入流的扫描仪,并且您关闭了扫描仪时,它也会自动关闭其后面的输入流。也就是说,在您第一次关闭scn
时,您已经关闭了System.in
下次在系统上创建扫描仪时,它基本上是一个封闭流上的扫描仪。当您尝试调用任何nextXXX
方法时,它会告诉您流中没有这样的元素。这是因为该流已经关闭
您应该做的是在程序开始时只打开扫描仪一次,然后在程序结束时关闭扫描仪一次。您可以继续使用相同的扫描仪-实际上不需要为同一输入流打开多个扫描仪。在
中打开和关闭系统是危险的。我建议您基于System.in为此目的和整个程序创建一个扫描仪,并将其作为参数传递给方法。此外,先前扫描的令牌可能是重要的,即使是使用不同的扫描对象完成的。