我正在用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();
方法,而第二个实例是同一个类的实例吗?
答案 0 :(得分:0)
不要close()
Scanner
。当您关闭扫描仪时,它会关闭System.in
,因此您的第二台扫描仪无需阅读。
在Scanner
上使用System.in
时,您应该只创建一个,并重复使用它。