Java一维数组程序异常处理后Y/N重试提示被跳过问题排查
解决Java数组程序中InputMismatchException后Y/N提示被跳过的问题
问题根源
当InputMismatchException触发时,用户输入的无效内容(比如非数字字符)会残留在Scanner的输入缓冲区里,后续调用next()或nextInt()时会直接读取这些无效内容,导致程序跳过Y/N的交互逻辑,直接跳回循环开头。
修复步骤
- 捕获异常后清空Scanner缓冲区:在catch块里调用
scanner.nextLine(),把缓冲区里剩下的无效输入全部丢弃,避免影响后续的输入读取。 - 用循环标志控制流程:别重复复制重试代码,通过布尔变量来控制跳转,让代码逻辑更清晰。
完整修复代码示例
import java.util.InputMismatchException; import java.util.Scanner; public class ArrayStats { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean restart; do { restart = false; int size = 0; boolean validSize = false; // 获取合法数组大小 while (!validSize) { try { System.out.print("请输入数组大小(1-25之间):"); size = scanner.nextInt(); if (size >= 1 && size <= 25) { validSize = true; } else { System.out.println("错误:数组大小必须在1-25范围内,请重新输入。"); } } catch (InputMismatchException e) { System.out.println("错误:请输入有效的整数。"); scanner.nextLine(); // 清空缓冲区里的无效输入 } } // 输入数组元素 int[] array = new int[size]; boolean validElements = true; for (int i = 0; i < size; i++) { try { System.out.print("请输入第" + (i + 1) + "个元素:"); array[i] = scanner.nextInt(); } catch (InputMismatchException e) { System.out.println("错误:请输入有效的整数元素。"); scanner.nextLine(); // 清空缓冲区 validElements = false; break; // 跳出元素输入循环,重新走流程 } } if (!validElements) { continue; // 直接进入重启判断环节 } // 计算统计数据 int sum = 0, oddSum = 0, evenSum = 0; int max = array[0], min = array[0]; for (int num : array) { sum += num; if (num % 2 == 0) { evenSum += num; } else { oddSum += num; } if (num > max) max = num; if (num < min) min = num; } double average = (double) sum / size; // 展示结果 System.out.println("\n数组统计结果:"); System.out.println("总和:" + sum); System.out.println("平均值:" + average); System.out.println("奇数和:" + oddSum); System.out.println("偶数和:" + evenSum); System.out.println("最大值:" + max); System.out.println("最小值:" + min); // 重启/退出判断 boolean validChoice = false; while (!validChoice) { try { System.out.print("\n是否重新运行程序?(Y/N):"); String choice = scanner.next().trim().toUpperCase(); if (choice.equals("Y")) { restart = true; validChoice = true; } else if (choice.equals("N")) { restart = false; validChoice = true; System.out.println("程序已退出。"); } else { System.out.println("错误:请输入Y或N。"); } } catch (InputMismatchException e) { System.out.println("错误:请输入有效的字符(Y/N)。"); scanner.nextLine(); // 清空缓冲区 } } scanner.nextLine(); // 读取剩余换行符,避免下一轮循环受影响 } while (restart); scanner.close(); } }
关键修复点说明
- 每次捕获异常后调用
scanner.nextLine():确保缓冲区里的无效输入被彻底清除,后续输入读取能正常获取用户的新输入。 - 用布尔变量控制流程:比如
validSize、validElements、validChoice,避免重复代码,逻辑更易维护。 - 重启判断单独做输入验证:确保用户只能输入Y/N,避免无效输入打乱程序流程。
内容的提问来源于stack exchange,提问作者JVG_2002
相关产品推荐
相关产品推荐

