最稳妥方式是用switch判断char型运算符,需trim()去空格、检查除零、校验非法字符及NaN/无穷大,输入时统一用nextLine()防换行符残留,计算逻辑应与输入解析分离。

用 switch 处理四则运算符最直接
用户输入两个数字和一个运算符(+、-、*、/),最稳妥的方式是用 switch 判断操作符,避免 if-else if 链过长或字符串 equals 的空指针风险。
注意:除法必须检查除数是否为 0,否则抛 ArithmeticException;switch 从 Java 7 起支持 String,但建议仍用 char(如 operator.charAt(0))提升效率和安全性。
- 用户输入的运算符应先
trim()去空格 -
/和%操作前必须加if (b == 0)判断 - 若用
double运算,结果保留小数点后两位可用String.format("%.2f", result)
封装成方法时别忽略参数校验和异常处理
把计算逻辑抽成 calculate(double a, double b, char op) 是常见做法,但实际调用中容易忽略边界情况。比如传入非法字符、Double.NaN 或无穷大值,会导致结果不可控。
建议在方法入口做最小必要校验:
立即学习“Java免费学习笔记(深入)”;
- 用
!"+-*/".contains(String.valueOf(op))快速过滤非法操作符 - 对
Double.isNaN(a) || Double.isInfinite(a)提前返回错误提示 - 不要直接 throw 新异常,而是返回
Optional或约定返回Double.NaN表示失败
控制台输入解析容易踩的坑:Scanner 的换行残留
用 Scanner 读取数字后紧接着读取运算符,常出现 nextLine() 返回空字符串——这是因为 nextInt() 或 nextDouble() 不消费结尾的换行符,导致下一次 nextLine() 立即读到回车。
解决方式统一且可靠:
- 全部改用
nextLine()读输入,再用Double.parseDouble()和String.trim()转换 - 或者在
nextInt()后手动加一句scanner.nextLine()清掉缓冲区 - 避免混用
nextDouble()和nextLine(),这是最常触发 bug 的组合
简单 GUI 版本只需 Swing + ActionListener
如果想快速做出带按钮的界面,不用 JavaFX,Swing 足够轻量。核心是给每个数字按钮和运算符按钮绑定 ActionListener,用一个 StringBuilder 缓存当前输入表达式,点击 = 时调用上面封装好的 calculate 方法。
关键细节:
- 清屏按钮要重置
StringBuilder和显示文本,不只是设空字符串 - 连续点击运算符应替换上一个(如
5 + 3 *中再按-,应变成5 + 3 -) - 显示组件推荐用
JTextField并设setEditable(false),防止手动输入干扰逻辑
public class SimpleCalculator {
public static Double calculate(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : null;
default: return null;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter first number: ");
double a = Double.parseDouble(sc.nextLine().trim());
System.out.print("Enter operator (+, -, *, /): ");
char op = sc.nextLine().trim().charAt(0);
System.out.print("Enter second number: ");
double b = Double.parseDouble(sc.nextLine().trim());
Double result = calculate(a, b, op);
if (result != null) {
System.out.println("Result: " + result);
} else {
System.out.println("Invalid operation or division by zero.");
}
}}
真实项目里,运算符解析和数值合法性比看起来更琐碎;哪怕只是命令行工具,也建议把输入解析和业务计算彻底分开,不然调试时根本分不清是用户输错了,还是你没截住异常。










