使用Scanner.nextInt()读取多行整数对时最后一次循环需按回车结束
问题根因
- 你的问题本质是Java
Scanner类的特性和控制台行缓冲机制共同作用的结果:nextInt()只会读取输入流中的整数内容,不会处理整数后方的空格、换行符等空白分隔符,且默认会跳过所有前置空白符查找下一个整数。- 操作系统控制台默认采用行缓冲模式:所有输入的内容,只有按下回车键之后,才会被批量写入程序的输入缓冲区供
Scanner读取。输入最后一组整数2 4后如果没有手动输入换行,这行数据还停留在控制台缓存中,程序无法读取到第二个整数,就会进入阻塞等待状态。 - 如果是直接粘贴整段输入触发该问题,一般是因为粘贴的内容最后一行末尾没有携带换行符,同样会导致最后一组数据无法被程序读取到。
解决方案
方案1:快速修复(保留nextInt()写法)
读取完前两个全局使用的整数后,先调用一次nextLine()清空残留的换行符,同时保证输入/粘贴的内容最后一行末尾带换行符即可:
// 前两个全局值的读取逻辑 int num1 = input.nextInt(); int numEdges = input.nextInt(); input.nextLine(); // 清空第二行末尾残留的换行符 for (int i = 0; i < numEdges; i++) { int x = input.nextInt(); int y = input.nextInt(); edges.add(new int[]{x, y}); System.out.println("x-y: " + x + " " + y); }
方案2:更稳妥的整行读取(彻底避免分隔符残留问题)
直接按行读取输入后拆分整数,不会受换行符残留、行缓冲的影响:
// 前两个全局值的读取逻辑 int num1 = Integer.parseInt(input.nextLine()); int numEdges = Integer.parseInt(input.nextLine()); for (int i = 0; i < numEdges; i++) { String[] parts = input.nextLine().split(" "); int x = Integer.parseInt(parts[0]); int y = Integer.parseInt(parts[1]); edges.add(new int[]{x, y}); System.out.println("x-y: " + x + " " + y); }
内容的提问来源于stack exchange,提问作者Jerridan B
相关产品推荐
相关产品推荐

