
本文揭示了java计算器程序中减法(s)和乘法(m)操作恒返回0.0的根本原因:条件判断误将输入字符写为"b"/"c"而非"s"/"m",导致分支未匹配,而未初始化的double字段sum默认值为0.0。
本文揭示了java计算器程序中减法(s)和乘法(m)操作恒返回0.0的根本原因:条件判断误将输入字符写为"b"/"c"而非"s"/"m",导致分支未匹配,而未初始化的double字段sum默认值为0.0。
在您提供的代码中,Calculator.doMaths() 方法使用了 if-else if 链来分发运算逻辑,但关键逻辑存在硬编码错误:
else if(operation.equalsIgnoreCase("b")){ // ❌ 错误:应为 "s" 表示 subtract
sum = num1 - num2;
}
else if(operation.equalsIgnoreCase("c")){ // ❌ 错误:应为 "m" 表示 multiply
sum = num1 * num2;
}用户在运行时输入的是 "s"(subtract)或 "m"(multiply),但程序只识别 "a"、"b"、"c"、"d" —— 其中仅 "a"(add)和 "d"(divide)能命中对应分支;而 "s" 和 "m" 完全不匹配任何条件,导致 sum 字段从未被赋值。
由于 sum 是类的私有 double 成员变量(primitive type),Java 规定其默认初始值为 0.0(参见 Java官方文档:Primitive Data Types)。因此,无论输入什么数字,只要走不到 sum = ... 赋值语句,方法最终就必然返回 0.0。
✅ 正确修复方式是严格对齐用户提示与条件判断:
立即学习“Java免费学习笔记(深入)”;
public double doMaths(double sum1, double sum2, String operation) {
this.num1 = sum1; // 推荐使用 this. 明确区分参数与成员变量
this.num2 = sum2;
if ("a".equalsIgnoreCase(operation)) {
return num1 + num2;
} else if ("s".equalsIgnoreCase(operation)) { // ✅ 修正为 "s"
return num1 - num2;
} else if ("m".equalsIgnoreCase(operation)) { // ✅ 修正为 "m"
return num1 * num2;
} else if ("d".equalsIgnoreCase(operation)) {
if (num2 == 0) {
throw new ArithmeticException("Division by zero");
}
return num1 / num2;
} else {
throw new IllegalArgumentException("Unsupported operation: " + operation);
}
}? 进阶优化建议:
-
避免冗余字段:
num1、num2、sum作为实例变量并无必要——它们仅在单次doMaths()调用中使用。应改为纯局部变量,提升线程安全性与可读性; - 推荐 switch 表达式(Java 14+):更简洁、更安全(编译期检查穷尽性):
public double doMaths(double a, double b, String op) {
return switch (op.toLowerCase()) {
case "a" -> a + b;
case "s" -> a - b;
case "m" -> a * b;
case "d" -> {
if (b == 0) throw new ArithmeticException("Cannot divide by zero");
yield a / b;
}
default -> throw new IllegalArgumentException("Unknown op: " + op);
};
}⚠️ 注意事项:
- 始终校验除零异常(
b == 0),否则Double.NaN或Infinity可能掩盖逻辑缺陷; - 使用
equalsIgnoreCase()或统一转小写(如toLowerCase())增强用户输入容错性; - 在
MathsApp类名拼写上存在笔误(应为MathApp),虽不影响运行,但建议统一命名规范。
通过修正分支条件并消除未初始化状态依赖,减法与乘法即可正确返回计算结果。


















