问:来自标准输入的Java Scanner.nextLine()会抛出NoSuchElementException,但是'输入'没有按下键盘

时间:2015-10-21 13:50:14

标签: java java.util.scanner

我正在用Java编写一个小型PvP游戏,它有一个服务器(主机)和一个客户端(第二个玩家),通过一对套接字进行通信。

如果玩家希望加入预先建立的游戏,我会通过标准输入(string[] filePaths = Directory.GetFiles(Path); foreach (string filePath in filePaths) { var name = new FileInfo(filePath).Name; name = name.ToLower(); if (name != "file1.exe" || name != "file2.exe") { File.Delete(filePath); } } )提示游戏主机的IP地址。为此,我使用System.in实例。当我尝试阅读下一行并将其提供给Scanner构造函数时,我收到以下异常:

String

尽管“进入”这一事实仍然存在。键盘上的键还没有按下。

以前只使用过一次标准输入:

Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at BattleshipServer.run(BattleshipServer.java:45)
at java.lang.Thread.run(Thread.java:745)

和导致错误的第二次使用:(第三行发生错误)

public static void main(String[] args){
    if (args.length != 1)
        printErrorMessageAndExit(USAGE_ERROR_MESSAGE);
    int port = Integer.parseInt(args[0]);
    if (port < 0 || port > 65535)
        printErrorMessageAndExit("Error: invalid port number");
    System.out.println("Do you wish to join or host a game? ");
    Scanner scanner = new Scanner(System.in);
    String selection = scanner.nextLine();
    scanner.close();
    if (!selection.equals("join") && !selection.equals("host"))
        printErrorMessageAndExit("Error: please select 'join' or 'host'");
 .
 .
 .
}

我似乎无法找到问题,但我确实知道标准输入的第一次读取会清除缓冲区,因此在第二次调用时它是空的,但它应该阻塞直到&#39;进入&#39;再次按下键!

这可能是因为第一个扫描程序实例是 System.out.println("Please enter host's IP address: "); Scanner scanner = new Scanner(System.in); String address = scanner.nextLine(); scanner.close(); 方法,而第二个实例是同一个类的实例吗?

1 个答案:

答案 0 :(得分:0)

不要close() Scanner。当您关闭扫描仪时,它会关闭System.in,因此您的第二台扫描仪无需阅读。

Scanner上使用System.in时,您应该只创建一个,并重复使用它。