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

Scanner.next()无法读取奇数行首字符的问题排查求助

问题原因与解决方法

核心问题

你的代码出现奇数行顶点ID被错误读取的原因有两个:

  1. Scanner不区分行边界:hasNextInt()仅检查输入流中是否存在整数,不管它在第几行。第一次循环处理完0的邻接边后,输入流中还剩1 0 14 ...这些整数,while会继续执行,直接把下一行的顶点ID1读走,导致后续循环无法正确获取目标ID。
  2. 空白处理混乱:inputs.skip("\n")只能匹配单一换行符,无法处理回车符(\r)、多个空格等空白场景;且读取顶点数量5后,未清理剩余的换行符,导致第一次读取时的空白处理出错。

排查步骤

  1. 添加调试日志:在关键读取步骤前,用inputs.peek()查看输入流的下一个字符,确认是否有残留的空白或意外字符。比如在newVertexID = inputs.next("\\d+")前打印:
    System.out.println("下一个字符:" + (char)inputs.peek());
    
  2. 简化输入测试:先用少量输入(比如2个顶点)测试,观察每一步的读取结果,定位是哪一行、哪一步出现了跨读取的问题。
  3. 检查Scanner状态:避免混合使用nextInt()和next(String)时的空白残留问题——nextInt()只会读取整数,不会消费后面的换行符,而next()会自动跳过前面的空白。

修复代码

改用逐行读取+每行独立解析的方式,严格控制每一行的处理范围,避免跨行读取:

Graph graph = new Graph();  
Scanner inputs = new Scanner(System.in);
int vertexCounts = inputs.nextInt();
inputs.nextLine(); // 清理顶点数量后的换行符

for (int i = 0; i < vertexCounts; i++){
    // 读取当前整行内容
    String line = inputs.nextLine();
    Scanner lineScanner = new Scanner(line);
    
    // 读取当前顶点ID
    String newVertexID = lineScanner.next("\\d+");
    System.out.println(newVertexID);
    Vertex newVertex = new Vertex(newVertexID);
    graph.addVertex(newVertex);
    
    // 解析该行的邻接边(每两个元素为一组:目标顶点ID + 权重)
    while(lineScanner.hasNextInt()){
        String targetID = lineScanner.next("\\d+");
        int weight = lineScanner.nextInt();
        // System.out.println("目标顶点:" + targetID + ",权重:" + weight);
        graph.addEdge(newVertexID, targetID, weight);
    }
    lineScanner.close();
}
inputs.close();

修复逻辑说明

  1. 逐行读取:用inputs.nextLine()获取当前顶点的整行数据,确保每一轮循环只处理当前顶点的信息,不会干扰下一行。
  2. 独立解析每行:为每行创建单独的Scanner,避免全局Scanner的状态混乱,彻底解决行边界问题。
  3. 清理初始换行:读取顶点数量后用nextLine()消费剩余的换行符,避免初始空白影响后续读取。

内容的提问来源于stack exchange,提问作者Goamhobala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:00:29