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

Java循环计算器功能异常求助及代码优化建议

解决你的Java计算器问题&代码优化建议

刚接触Java遇到这种问题很正常,我帮你拆解下问题原因,再给出修复和优化方案:

问题1:条件判断失效&switch逻辑错误

你遇到的第一个问题,核心是字符和数字的混淆,还有switch缺少break导致的逻辑贯穿:

  • 当你用sc.next().charAt(0)获取输入时,得到的是字符类型(比如输入1,实际拿到的是'1',对应ASCII码是49),但你的判断条件里用的是数字1,所以op != 1永远为true,导致错误提示被触发,甚至直接终止程序。
  • 另外你的switch语句里每个case都没加break,这会导致匹配到第一个case后,继续执行后面所有case的代码,最终计算结果完全不符合预期。

问题2:程序直接终止&循环无法回到开头

  • 你用了return处理错误输入,return会直接结束整个main方法,程序自然就终止了,应该换成continue让循环回到开头重新输入。
  • 还有i=i++;是错误写法:后置自增i++会先返回i的原值,再完成自增,所以i=i++相当于i的值根本没变化,应该直接写i++;。

修复+优化后的完整代码

import java.util.Scanner;

public class Kalkulacka {
    public static void main(String[] args) {
        System.out.println("Vitajte v programe na výpočet jednoduchých matematických príkladov!");
        Scanner sc = new Scanner(System.in);
        double priklad = 0;
        int i = 0;

        // 初始输入第一个数字
        System.out.println("Zadajte číslo");
        priklad = sc.nextDouble();

        while (true) {
            // 根据循环次数显示不同的操作选项,减少重复代码
            System.out.println("Zvoľte si operátora:");
            System.out.println("1- +");
            System.out.println("2- -");
            System.out.println("3- *");
            System.out.println("4- /");
            if (i >= 1) {
                System.out.println("5- =");
            }

            char op = sc.next().charAt(0);

            // 验证输入的操作符是否合法
            boolean isValidOp;
            if (i < 1) {
                isValidOp = (op == '1' || op == '2' || op == '3' || op == '4');
            } else {
                isValidOp = (op == '1' || op == '2' || op == '3' || op == '4' || op == '5');
            }

            if (!isValidOp) {
                System.out.println("Zadali ste nesprávne číslo, skúste znova!");
                continue; // 回到循环开头,重新输入
            }

            // 如果选择等于,直接跳出循环计算结果
            if (op == '5') {
                break;
            }

            // 输入第二个数字
            System.out.println("Zadajte číslo");
            double b = sc.nextDouble();

            // 根据操作符计算结果,每个case都加break避免逻辑贯穿
            switch (op) {
                case '1':
                    priklad += b;
                    break;
                case '2':
                    priklad -= b;
                    break;
                case '3':
                    priklad *= b;
                    break;
                case '4':
                    // 增加除零判断,避免运行时异常
                    if (b == 0) {
                        System.out.println("Nelie deliť nulou! Skúste znova.");
                        continue;
                    }
                    priklad /= b;
                    break;
            }

            i++; // 正确的自增写法
        }

        System.out.println("Výsledok je: " + priklad);
        sc.close(); // 关闭Scanner资源,养成良好习惯
    }
}

额外的优化点

  • 合并了重复的操作符提示代码,减少冗余
  • 增加了除零判断,避免程序抛出运行时异常
  • 主动关闭Scanner资源,养成良好的资源管理习惯
  • 简化了变量定义,比如不需要单独的a变量,直接用priklad存储初始值
  • 用boolean变量简化了合法性判断逻辑,代码更易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:49:07