【发布时间】: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。 -
@KevinEsche 与 System.in 关联的 PrintStream?而且我认为 System.in 的类型是 InputStream ...