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

Java简易计算器首次尝试出现问题,请求技术排查

解决Java简易计算器的常见问题与代码优化建议

从你贴出的不完整代码来看,你在编写简易计算器时大概率遇到了异常处理或循环逻辑的问题吧?我结合你现有代码的思路,帮你梳理下常见的坑和修复方案:

你提供的现有代码片段

package com.indie;
import java.util.InputMismatchException;
import java.util.Scanner;
import static com.indie.Operations.*;

public class Main {
    private static double Number1;
    private static double Number2;
    private static double Total;
    private static String Symbol;
    private static boolean noError;
    private static boolean exceptioncaught;

    public static void main(String[] args) throws InterruptedException{
        noError = false;
        while (!noError) {
            exceptioncaught = false;
            while (!exc...
    }
}

核心问题分析与修复方案

1. 完善异常捕获逻辑

你的代码写到while (!exc...就中断了,推测是想处理用户输入非数字的情况。这里需要完整实现try-catch块,并且重置Scanner缓冲区,不然捕获异常后会直接进入死循环。示例代码如下:

Scanner scanner = new Scanner(System.in);
while (!noError) {
    exceptioncaught = false;
    try {
        System.out.print("请输入第一个数字: ");
        Number1 = scanner.nextDouble();
        System.out.print("请输入操作符(+/-/*/): ");
        Symbol = scanner.next();
        System.out.print("请输入第二个数字: ");
        Number2 = scanner.nextDouble();
        exceptioncaught = false;
        noError = true; // 输入合法,退出循环
    } catch (InputMismatchException e) {
        System.out.println("输入错误!请输入有效的数字");
        scanner.nextLine(); // 清除缓冲区的无效输入
        exceptioncaught = true;
    }
}

2. 优化变量作用域

你把所有变量都声明为静态类变量,其实这些变量只在main方法的循环内使用,改为局部变量更符合面向对象的设计原则,还能避免不必要的全局状态污染:

public static void main(String[] args) throws InterruptedException{
    Scanner scanner = new Scanner(System.in);
    boolean noError = false;
    while (!noError) {
        boolean exceptioncaught = false;
        double number1 = 0;
        double number2 = 0;
        String symbol = "";
        // 后续逻辑...
    }
}

3. 操作符合法性校验

别忽略操作符的校验!用户可能输入#、@这类非法符号,直接计算会出错,得加一层判断:

// 输入操作符后添加判断
if (!symbol.equals("+") && !symbol.equals("-") && !symbol.equals("*") && !symbol.equals("/")) {
    System.out.println("无效的操作符!请输入+/-/*/");
    exceptioncaught = true;
    noError = false;
    continue; // 重新循环输入
}

4. 除法的除数为0处理

做除法时必须判断除数是否为0,不然会抛出ArithmeticException,直接让程序崩溃:

double total = 0;
switch (symbol) {
    case "+":
        total = number1 + number2;
        break;
    case "-":
        total = number1 - number2;
        break;
    case "*":
        total = number1 * number2;
        break;
    case "/":
        if (number2 == 0) {
            System.out.println("错误:除数不能为0");
            exceptioncaught = true;
            noError = false;
            continue;
        }
        total = number1 / number2;
        break;
}

完整的可运行示例代码

package com.indie;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean noError = false;

        while (!noError) {
            boolean exceptioncaught = false;
            double number1 = 0;
            double number2 = 0;
            String symbol = "";

            try {
                // 输入第一个数字
                System.out.print("请输入第一个数字: ");
                number1 = scanner.nextDouble();

                // 输入操作符并校验
                System.out.print("请输入操作符(+/-/*/): ");
                symbol = scanner.next();
                if (!symbol.equals("+") && !symbol.equals("-") && !symbol.equals("*") && !symbol.equals("/")) {
                    System.out.println("无效的操作符!请输入+/-/*/");
                    exceptioncaught = true;
                    scanner.nextLine(); // 清除缓冲区
                    continue;
                }

                // 输入第二个数字
                System.out.print("请输入第二个数字: ");
                number2 = scanner.nextDouble();

                // 执行计算
                double total = 0;
                switch (symbol) {
                    case "+":
                        total = number1 + number2;
                        break;
                    case "-":
                        total = number1 - number2;
                        break;
                    case "*":
                        total = number1 * number2;
                        break;
                    case "/":
                        if (number2 == 0) {
                            System.out.println("错误:除数不能为0");
                            exceptioncaught = true;
                            continue;
                        }
                        total = number1 / number2;
                        break;
                }

                // 输出结果
                System.out.printf("计算结果:%.2f %s %.2f = %.2f%n", number1, symbol, number2, total);
                noError = true; // 计算完成,退出循环

            } catch (InputMismatchException e) {
                System.out.println("输入错误!请输入有效的数字");
                scanner.nextLine(); // 清除无效输入
                exceptioncaught = true;
            }
        }
        scanner.close();
    }
}

你可以把这段代码替换你的现有代码,测试下输入各种合法/非法内容的情况,应该就能解决你遇到的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:48