Java计算器程序InputMismatchException无法被正常捕获问题求助
问题根因
Scanner调用nextInt()触发输入不匹配异常时,导致异常的非法输入不会被自动从输入缓冲区移除,会一直残留。你在catch块中未清空缓冲区就再次调用nextInt(),会重复读取到同一份非法数据,再次抛出异常,形成“异常无法被捕获”的假象。- 你代码中default分支的
nextInt()调用没有异常捕获逻辑,用户输入非int值时会直接导致程序崩溃。
修复方案
修改逻辑如下:
- 捕获
InputMismatchException后,先调用in.nextLine()清空输入缓冲区的残留非法内容 - 把所有用户输入读取逻辑收拢到带异常捕获的重试循环中,避免在catch、default分支中裸调用
nextInt() - 类名遵循Java规范首字母大写,程序结束后关闭
Scanner资源
修复后完整代码:
import java.util.*; public class Calculator { public static void main(String[] args) { boolean run = true; Scanner in = new Scanner(System.in); while (run) { System.out.println("欢迎使用计算器!请选择以下功能:"); System.out.println("1. 二进制转换器"); System.out.println("2. 八进制转换器"); System.out.println("3. 十进制转换器"); System.out.println("4. 十六进制转换器"); System.out.println("5. 二进制计算器"); System.out.println("6. 八进制计算器"); System.out.println("7. 普通计算器"); System.out.println("8. 十六进制计算器"); System.out.println("9. 退出"); int choice = 0; boolean inputValid = false; // 输入重试逻辑,直到拿到合法整数 while (!inputValid) { System.out.println("请输入数字:"); try { choice = in.nextInt(); inputValid = true; } catch (InputMismatchException e) { System.out.println("请输入有效的数字!"); // 清空缓冲区残留非法输入 in.nextLine(); } } switch (choice) { case 1: // 可在此补充二进制转换器业务逻辑 break; case 2: // 可在此补充八进制转换器业务逻辑 break; case 3: // 可在此补充十进制转换器业务逻辑 break; case 4: // 可在此补充十六进制转换器业务逻辑 break; case 5: // 可在此补充二进制计算器业务逻辑 break; case 6: // 可在此补充八进制计算器业务逻辑 break; case 7: // 可在此补充普通计算器业务逻辑 break; case 8: // 可在此补充十六进制计算器业务逻辑 break; case 9: run = false; System.out.println("程序已退出"); break; default: System.out.println("输入错误,请重新输入。"); break; } } in.close(); } }
内容的提问来源于stack exchange,提问作者Gabrielp
相关产品推荐
相关产品推荐

