You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

记忆配对游戏客户端服务器传坐标时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:34:08