【问题标题】:Q: Java Scanner.nextLine() from standard input throws NoSuchElementException, but 'enter' wasn't pressed on the keyboard [duplicate]问:标准输入中的 Java Scanner.nextLine() 引发 NoSuchElementException,但未在键盘上按下“输入”[重复]
【发布时间】:2016-01-20 13:24:58
【问题描述】:

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

如果玩家希望加入预先建立的游戏,我会通过标准输入 (System.in) 提示输入游戏主机的 IP 地址。为此,我使用了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'");
 .
 .
 .
}

以及导致错误的第二次使用:(第三行出现错误)

 System.out.println("Please enter host's IP address: ");
 Scanner scanner = new Scanner(System.in);
 String address = scanner.nextLine();
 scanner.close();

我似乎找不到问题,但我知道第一次从标准输入读取会清除缓冲区,所以在第二次调用中它是空的,但它应该阻塞直到按下“输入”键又来了!

这可能是因为第一个扫描仪实例位于 static 方法中,而第二个实例位于同一类的实例中?

【问题讨论】:

  • @Arc676 你应该找到一个同样的问题并投票关闭。
  • @Arc676 我宁愿认为这是因为他关闭了与System.in 关联的PrintStream,而不是nextFoo 答案之后的常见nextLine
  • 我找到的最佳匹配:stackoverflow.com/questions/23621668/…
  • @KevinEsche 与 System.in 关联的 PrintStream?而且我认为 System.in 的类型是 InputStream ...

标签: java java.util.scanner


【解决方案1】:

不要close()Scanner。当您关闭扫描仪时,它会关闭System.in,因此您的第二个扫描仪没有可读取的内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多