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
相关产品推荐
相关产品推荐

