记忆配对游戏客户端服务器传坐标时InputMismatchException问题咨询
解决记忆配对游戏服务器读取坐标的InputMismatchException问题
嘿,我太懂这种第一次正常、第二次突然炸的诡异问题了——十有八九是输入流里残留了非整数的垃圾数据(比如换行符),让你的读取工具(我猜是Java的Scanner?)第二次抓错了东西。给你拆解几个最可能的原因和解决办法:
1. 客户端发送坐标的姿势不对
如果客户端用print()发送坐标而不是println(),或者发完后没刷新输出流,就会导致坐标后面没有换行符,服务器第一次读完整数后,流里还留着一些残留的空白或者不完整的字符,第二次读的时候就会把这些当成要解析的整数,直接抛出异常。
解决办法:
- 客户端每次发送坐标后,用
println()代替print(),这样会自动追加换行符,帮服务器区分两次输入; - 如果用的是
DataOutputStream这类字节流工具,发送完整数后记得调用flush()确保数据全部发送出去。
2. 服务器读取后没清理缓冲区残留
假设你用的是Scanner.nextInt()来读整数,这个方法只会读取数字部分,不会处理后面的换行符。第一次读完坐标后,换行符还留在Scanner的缓冲区里,第二次调用nextInt()时,它会先读到这个换行符,发现不是整数,直接抛出InputMismatchException。
解决办法:
有两种靠谱的处理方式:
- 方式一:每次读完整数后,调用
scanner.nextLine()把残留的换行符吃掉:Scanner scanner = new Scanner(clientSocket.getInputStream()); for (int i = 0; i < 2; i++) { int coord = scanner.nextInt(); // 读取坐标 // 处理你的逻辑... scanner.nextLine(); // 清理残留的换行符 } - 方式二:全程用
nextLine()读取整行,再转成整数(更稳妥,还能过滤空格):Scanner scanner = new Scanner(clientSocket.getInputStream()); for (int i = 0; i < 2; i++) { String rawCoord = scanner.nextLine().trim(); // 读取整行并去掉首尾空格 int coord = Integer.parseInt(rawCoord); // 转成整数 // 处理你的逻辑... }
3. 网络粘包问题(概率稍低但值得排查)
有时候网络传输会把客户端两次发送的内容粘在一起,比如第一次发"2",第二次发"4",结果服务器收到的是"24"——或者如果客户端发送格式不规范,可能导致第二次读取的内容是不完整的整数或者混杂了其他字符。
解决办法:
给每次发送的坐标加明确的分隔标记(比如固定用换行符分隔),或者用固定长度的字节流发送整数,服务器每次读取固定字节数再解析,这样就能避免粘包导致的读取错误。
快速排查技巧
你可以在服务器第124行之前加个日志,打印一下当前输入流里的内容,比如:
// 在第124行之前加 if (scanner.hasNextLine()) { System.out.println("即将读取的原始内容:" + scanner.nextLine()); }
这样就能直观看到第二次到底读到了什么,快速定位问题根源。
内容的提问来源于stack exchange,提问作者Ammanuel
相关产品推荐
相关产品推荐

