Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.NoSuchElementException:找不到行-读取用户输入只工作一次_Java_Java.util.scanner - Fatal编程技术网

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为此目的和整个程序创建一个扫描仪,并将其作为参数传递给方法。此外,先前扫描的令牌可能是重要的,即使是使用不同的扫描对象完成的。