
本文解析java swing计算器中减法(s)和乘法(m)操作始终返回0.0的根本原因——条件分支误用字母'b'/'c'而非用户输入的's'/'m',并提供基于switch表达式的简洁修复方案及健壮性增强建议。
本文解析java swing计算器中减法(s)和乘法(m)操作始终返回0.0的根本原因——条件分支误用字母'b'/'c'而非用户输入的's'/'m',并提供基于switch表达式的简洁修复方案及健壮性增强建议。
在您提供的代码中,Calculator.doMaths() 方法使用了 if-else if 链来判断用户输入的运算符,但存在关键逻辑错误:用户被提示输入 "a,s,m or d"(即加、减、乘、除),而代码中却将减法对应到 "b"、乘法对应到 "c":
else if(operation.equalsIgnoreCase("b")){ // ❌ 应为 "s"
sum=num1-num2;
}
else if(operation.equalsIgnoreCase("c")){ // ❌ 应为 "m"
sum=num1*num2;
}
由于用户实际输入的是 "s" 或 "m",所有 if 和 else if 分支均未匹配,程序直接跳过赋值逻辑,最终返回未初始化的成员变量 private double sum;。根据 Java 规范,类成员变量(primitive type)默认初始化为 0.0(double 类型的默认值),因此无论输入何种数字,减法和乘法结果恒为 0.0。
✅ 正确修复方式是统一校验用户预期输入字符:
public double doMaths(double num1, double num2, String operation) {
// 推荐:直接使用参数,避免冗余字段赋值(num1/num2/sum 作为成员变量在此场景无必要)
return switch (operation.toLowerCase().trim()) {
case "a" -> num1 + num2;
case "s" -> num1 - num2; // ✅ 修正为 "s"
case "m" -> num1 * num2; // ✅ 修正为 "m"
case "d" -> {
if (num2 == 0) {
throw new ArithmeticException("Division by zero");
}
yield num1 / num2;
}
default -> throw new IllegalArgumentException("Unsupported operation: " + operation);
};
}
关键改进说明:
- 使用
switch表达式替代冗长if-else,提升可读性与可维护性(Java 14+ 支持);- 添加
trim()防止空格导致匹配失败;- 对除法增加零除检查,并抛出明确异常;
- 移除无意义的私有字段
num1/num2/sum,改用方法参数局部处理,避免状态污染;default分支确保非法输入及时暴露,便于调试。
⚠️ 注意事项:
- 若需兼容 Java 13 及更早版本,请回退至传统
switch语句(注意break)或保留if-else if,但务必修正字符常量; - 在生产环境中,建议将运算符映射封装为枚举(如
Operation.ADD,Operation.SUBTRACT),进一步提升类型安全; -
JOptionPane.showInputDialog返回null时Double.parseDouble(null)会抛出NullPointerException,应在解析前做空值校验。
通过以上修正,您的计算器即可准确执行全部四则运算,同时代码更健壮、清晰且符合现代 Java 实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











