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

时间:2015-02-08 14:25:25

标签: java java.util.scanner

我试图创建一个非常简单的程序(这不重要,但是一个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();
    //...
}

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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