
本文解析 java 程序中减法与乘法始终返回 0.0 的典型错误:核心在于条件分支中操作符字符匹配错误(误用 "b"/"c" 而非用户输入的 "s"/"m"),导致分支未执行,而未初始化的 double 字段默认值为 0.0。
本文解析 java 程序中减法与乘法始终返回 0.0 的典型错误:核心在于条件分支中操作符字符匹配错误(误用 "b"/"c" 而非用户输入的 "s"/"m"),导致分支未执行,而未初始化的 double 字段默认值为 0.0。
在您提供的 Calculator 类中,doMaths 方法使用了 if-else if 链判断用户输入的操作符,但逻辑存在关键错配:
// ❌ 错误代码(原始实现)
if(operation.equalsIgnoreCase("a")) { ... } // 正确:对应 "a"
else if(operation.equalsIgnoreCase("b")) { ... } // ❌ 应为 "s"(subtract),"b" 永远不匹配
else if(operation.equalsIgnoreCase("c")) { ... } // ❌ 应为 "m"(multiply),"c" 永远不匹配
else if(operation.equalsIgnoreCase("d")) { ... } // 正确:对应 "d"
当用户输入 "s" 或 "m" 时,所有 if 条件均不成立,方法跳过所有计算分支,直接返回未显式赋值的实例变量 sum。由于 sum 是 double 类型的实例字段(非局部变量),其默认初始值为 0.0(Java 规范规定:类字段若未初始化,默认值为 0、0.0、false 或 null)。这就是为何减法和乘法总是返回 0.0 的根本原因。
✅ 正确做法是严格对齐用户提示与条件判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public double doMaths(double num1, double num2, String operation) {
// 建议:直接使用参数,避免冗余字段(num1/num2/sum 作为实例变量在此场景无必要)
String op = operation.toLowerCase().trim();
if ("a".equals(op)) {
return num1 + num2;
} else if ("s".equals(op)) { // ✅ 修正为 "s"
return num1 - num2;
} else if ("m".equals(op)) { // ✅ 修正为 "m"
return num1 * num2;
} else if ("d".equals(op)) {
if (num2 == 0) {
throw new ArithmeticException("Division by zero");
}
return num1 / num2;
} else {
throw new IllegalArgumentException("Unsupported operation: " + operation);
}
}
? 更优实践:使用 switch 表达式(Java 14+)
现代 Java 推荐用 switch 表达式提升可读性与安全性:
public double doMaths(double num1, double num2, String operation) {
String op = operation.toLowerCase().trim();
return switch (op) {
case "a" -> num1 + num2;
case "s" -> num1 - num2;
case "m" -> num1 * num2;
case "d" -> {
if (num2 == 0) throw new ArithmeticException("Cannot divide by zero");
yield num1 / num2;
}
default -> throw new IllegalArgumentException("Invalid operation: " + op);
};
}
⚠️ 注意事项与改进建议
-
避免冗余字段:
Calculator中的num1、num2、sum实例变量在单次计算中无状态需求,应移除,直接使用方法参数——这能防止意外状态残留,提升线程安全性; -
防御性校验:除法必须检查除数是否为零,否则抛出
ArithmeticException; -
输入健壮性:对
operation执行trim()和toLowerCase(),容忍空格和大小写差异; -
异常处理:主程序(
MathsApp)应包裹doMaths调用并捕获异常,向用户友好提示错误(如JOptionPane.showMessageDialog(..., "Error: ...")); -
命名规范:类名应为
MathApp(非MathsApp),符合 Java 命名惯例。
修复后,程序将正确响应 a/s/m/d 输入,四则运算全部按预期执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










