Scanner.next()无法读取奇数行首字符的问题排查求助
问题原因与解决方法
核心问题
你的代码出现奇数行顶点ID被错误读取的原因有两个:
- Scanner不区分行边界:
hasNextInt()仅检查输入流中是否存在整数,不管它在第几行。第一次循环处理完0的邻接边后,输入流中还剩1 0 14 ...这些整数,while会继续执行,直接把下一行的顶点ID1读走,导致后续循环无法正确获取目标ID。 - 空白处理混乱:
inputs.skip("\n")只能匹配单一换行符,无法处理回车符(\r)、多个空格等空白场景;且读取顶点数量5后,未清理剩余的换行符,导致第一次读取时的空白处理出错。
排查步骤
- 添加调试日志:在关键读取步骤前,用
inputs.peek()查看输入流的下一个字符,确认是否有残留的空白或意外字符。比如在newVertexID = inputs.next("\\d+")前打印:System.out.println("下一个字符:" + (char)inputs.peek()); - 简化输入测试:先用少量输入(比如2个顶点)测试,观察每一步的读取结果,定位是哪一行、哪一步出现了跨读取的问题。
- 检查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();
修复逻辑说明
- 逐行读取:用
inputs.nextLine()获取当前顶点的整行数据,确保每一轮循环只处理当前顶点的信息,不会干扰下一行。 - 独立解析每行:为每行创建单独的
Scanner,避免全局Scanner的状态混乱,彻底解决行边界问题。 - 清理初始换行:读取顶点数量后用
nextLine()消费剩余的换行符,避免初始空白影响后续读取。
内容的提问来源于stack exchange,提问作者Goamhobala
相关产品推荐
相关产品推荐

