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

Java一维数组程序异常处理后Y/N重试提示被跳过问题排查

解决Java数组程序中InputMismatchException后Y/N提示被跳过的问题

问题根源

当InputMismatchException触发时,用户输入的无效内容(比如非数字字符)会残留在Scanner的输入缓冲区里,后续调用next()或nextInt()时会直接读取这些无效内容,导致程序跳过Y/N的交互逻辑,直接跳回循环开头。

修复步骤

  1. 捕获异常后清空Scanner缓冲区:在catch块里调用scanner.nextLine(),把缓冲区里剩下的无效输入全部丢弃,避免影响后续的输入读取。
  2. 用循环标志控制流程:别重复复制重试代码,通过布尔变量来控制跳转,让代码逻辑更清晰。

完整修复代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:52:54