如何解决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
相关产品推荐
相关产品推荐

