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

Java计算器程序InputMismatchException无法被正常捕获问题求助

问题根因
  • Scanner调用nextInt()触发输入不匹配异常时,导致异常的非法输入不会被自动从输入缓冲区移除,会一直残留。你在catch块中未清空缓冲区就再次调用nextInt(),会重复读取到同一份非法数据,再次抛出异常,形成“异常无法被捕获”的假象。
  • 你代码中default分支的nextInt()调用没有异常捕获逻辑,用户输入非int值时会直接导致程序崩溃。
修复方案

修改逻辑如下:

  1. 捕获InputMismatchException后,先调用in.nextLine()清空输入缓冲区的残留非法内容
  2. 把所有用户输入读取逻辑收拢到带异常捕获的重试循环中,避免在catch、default分支中裸调用nextInt()
  3. 类名遵循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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:51:02