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

Java计算器switch语句运算符多字符输入校验异常修复求助

Java计算器运算符输入校验问题修复方案

问题根因

现有代码的核心问题出在运算符读取逻辑:userOperation = operation.next().charAt(0) 仅提取输入字符串的第一个字符,完全没有校验输入的总长度,所以只要首字符匹配合法运算符,不管后续有没有多余字符都会正常执行,不会触发报错。另外同时创建两个Scanner实例读取同一个System.in输入流,也容易引发后续输入读取异常。

可行修复步骤

  • 第一步:合并两个Scanner实例为同一个,避免输入流冲突
  • 第二步:读取运算符时先获取完整的输入字符串,先判断字符串长度是否为1,长度不符合直接抛出非法输入提示
  • 第三步:长度校验通过后,再提取唯一的字符判断是否属于合法运算符,再走对应的运算逻辑

修复后完整代码

import java.util.Scanner;

public class javacalculator {
    public static void main(String[] args) {
        // 合并为单个Scanner实例
        Scanner scanner = new Scanner(System.in);

        double num1, num2, answer;

        System.out.print("Enter your full name: ");
        String userName = scanner.nextLine();

        System.out.println("+ Addition");
        System.out.println("- Subtraction");
        System.out.println("* Multiplication");
        System.out.println("/ Division");
        System.out.println("% Modulus");
        System.out.println("\n");


        System.out.print("Enter mathematical operator e.g. + for Addition: ");
        // 先读取完整的运算符输入字符串并去除首尾空格
        String opInput = scanner.next().trim();
        // 先校验长度是否为1
        if (opInput.length() != 1) {
            System.out.println("Invalid operator! Please enter a single valid operator.");
            scanner.close();
            return;
        }
        // 长度合法再提取字符
        char userOperation = opInput.charAt(0);

        switch (userOperation) {
            case '+':
                System.out.print("Enter first number: ");
                num1 = scanner.nextDouble();

                System.out.print("Enter the second number: ");
                num2 = scanner.nextDouble();

                answer = num1 + num2;
                System.out.print(num1 + " + " + num2 + " = " + answer);
                break;
            case '-':
                System.out.print("Enter first number: ");
                num1 = scanner.nextDouble();

                System.out.print("Enter the second number: ");
                num2 = scanner.nextDouble();

                answer = num1 - num2;
                System.out.print(num1 + " - " + num2 + " = " + answer);
                break;
            case '*':
                System.out.print("Enter first number: ");
                num1 = scanner.nextDouble();

                System.out.print("Enter the second number: ");
                num2 = scanner.nextDouble();

                answer = num1 * num2;
                System.out.print(num1 + " * " + num2 + " = " + answer);
                break;
            case '/':
                System.out.print("Enter first number: ");
                num1 = scanner.nextDouble();

                System.out.print("Enter the second number: ");
                num2 = scanner.nextDouble();
                // 额外新增除数为0的校验,避免算术异常
                if (num2 == 0) {
                    System.out.println("Error: Divisor cannot be zero.");
                    scanner.close();
                    return;
                }
                answer = num1 / num2;
                System.out.print(num1 + " / " + num2 + " = " + answer);
                break;
            case '%':
                System.out.print("Enter first number: ");
                num1 = scanner.nextDouble();

                System.out.print("Enter the second number: ");
                num2 = scanner.nextDouble();
                answer = num1 % num2;
                System.out.print(num1 + " % " + num2 + " = " + answer);
                break;
            default:
                System.out.println("Invalid operator!");
                break;
        }
        scanner.close();
    }
}

额外优化说明

  • 原代码读取数字用nextInt()仅支持整数输入,改为nextDouble()后支持小数运算
  • 新增输入字符串去空格逻辑,避免用户输入前后带空格导致校验失败
  • 用完Scanner后主动关闭释放输入流资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:27:02