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

如何解决Switch Case场景下用户首次输入字母触发的异常问题

问题解答

1. 关于Scanner提前抛出异常的疑问

是的,你程序里首次调用scan.nextInt()的代码(choice = scan.nextInt();)没有被任何try/catch块包裹,当用户输入字母这类非整数内容时,Scanner会直接抛出InputMismatchException,这个异常没被捕获就会直接导致程序崩溃。而你写的try/catch只在switch的default分支里,只能处理后续循环中的输入错误,完全覆盖不到程序启动时的第一次输入。

另外要注意:当Scanner抛出InputMismatchException后,错误的输入内容会留在输入缓冲区里,如果不清理,后续调用nextInt()会一直读取到同一个错误内容,反复抛出异常。

2. 处理首行输入的解决方案

推荐两种可靠的处理方式,都能统一处理首次和后续输入,避免重复输入问题:

方式一:用try/catch包裹所有输入操作,同时清理缓冲区

把所有读取整数的操作都放进try/catch里,捕获异常后用nextLine()清空输入缓冲区的错误内容,避免死循环:

import java.util.InputMismatchException;
import java.util.Scanner;

public class MenuExample {
    public static void main(String[] args) {
        int choice;
        Scanner scan = new Scanner(System.in);

        // 循环处理所有输入,包括首次输入
        while (true) {
            System.out.println("Enter a number");
            System.out.println("1: Example one");
            System.out.println("2: Example two");
            System.out.println("0: Exit");

            try {
                choice = scan.nextInt();
                switch (choice) {
                    case 1:
                        System.out.println("Example one successful");
                        break;
                    case 2:
                        System.out.println("Example two successful");
                        break;
                    case 0:
                        System.exit(0);
                    default:
                        System.out.println("Invalid option, please enter 0, 1 or 2");
                }
            } catch (InputMismatchException error) {
                System.out.println("Not a valid number: please enter an integer");
                // 清空缓冲区里的错误输入,避免后续重复读取
                scan.nextLine();
            }
        }
    }
}

方式二:用nextLine()读取所有输入,手动校验整数

这种方式更灵活,能完全控制输入内容,避免Scanner的类型匹配问题:

import java.util.Scanner;

public class MenuExample {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input;
        int choice;

        while (true) {
            System.out.println("Enter a number");
            System.out.println("1: Example one");
            System.out.println("2: Example two");
            System.out.println("0: Exit");

            input = scan.nextLine().trim(); // 读取整行输入,去除首尾空格
            // 用正则校验是否是整数(支持正负)
            if (input.matches("-?\\d+")) {
                choice = Integer.parseInt(input);
                switch (choice) {
                    case 1:
                        System.out.println("Example one successful");
                        break;
                    case 2:
                        System.out.println("Example two successful");
                        break;
                    case 0:
                        System.exit(0);
                    default:
                        System.out.println("Invalid option, please enter 0, 1 or 2");
                }
            } else {
                System.out.println("Not a valid number: please enter an integer");
            }
        }
    }
}

这两种方式都能处理首次输入非整数的情况,不会让程序崩溃,同时避免用户输入无效内容后陷入死循环。

内容的提问来源于stack exchange,提问作者NobleRuckus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:48:24