Scanner读取指定格式输入时跳过内容的问题求助
Scanner读取输入跳过行的问题分析与解决
嘿,我一眼就发现问题所在了——你的代码里连续调用了两次input.nextLine(),这就是导致输入行被跳过的核心原因!
问题根源
每次调用Scanner.nextLine()都会读取并消耗掉当前的一行输入。你在while循环的条件里先用了一次input.nextLine()来判断是否等于"-1",这行输入直接被消耗掉了;然后进入循环体后又调用了一次input.nextLine()去获取数据,相当于每轮循环跳过了一行原本要处理的输入,自然就出现了“跳过第一行和倒数第二行”的现象。
修正方案
解决思路很简单:把循环条件中读取的行先存储起来,复用这行数据进行判断和处理,避免重复调用nextLine()。同时,你原来通过charAt(0)取数字的方式不够健壮(比如遇到多位数就会出错),建议用字符串分割的方式来解析数对。
这里给你修正后的完整示例代码:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class InputProcessor { public static void main(String[] args) { Queue<int[]> jobs = new LinkedList<>(); // 假设队列存储int数组来保存数对 Scanner input = new Scanner(System.in); System.out.println("Enter values (enter '-1' to stop): "); String line; while (input.hasNextLine()) { line = input.nextLine(); // 先判断是否是终止指令 if (line.equals("-1")) { break; } // 按空格拆分每个数对(比如"0, 0 1, 1"拆成["0, 0", "1, 1"]) String[] pairs = line.split(" "); for (String pair : pairs) { // 按逗号+可选空格拆分,拿到两个数字 String[] nums = pair.split(",\\s*"); if (nums.length == 2) { // 确保格式正确 int firstNum = Integer.parseInt(nums[0]); int secondNum = Integer.parseInt(nums[1]); jobs.add(new int[]{firstNum, secondNum}); } } } // 验证队列中的内容 System.out.println("队列中的数对:"); while (!jobs.isEmpty()) { int[] pair = jobs.poll(); System.out.printf("%d, %d ", pair[0], pair[1]); } input.close(); } }
额外说明
- 用
split(",\\s*")可以兼容带空格或不带空格的数对格式(比如"0,0"或"0, 0"都能正确拆分) - 增加了格式校验(判断
nums.length == 2),避免输入格式错误导致程序崩溃 - 循环终止逻辑更清晰:读取到"-1"就跳出循环,不会漏掉最后一行输入
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

