Java运算符不主动处理计算错误,整数溢出静默截断,浮点运算返回NaN或Infinity,整型除零抛ArithmeticException而浮点除零返回Infinity,需手动校验防护。

Java 运算符本身不主动处理数值计算错误,而是遵循底层硬件和 JVM 规范直接执行运算;错误是否抛出、如何表现,取决于运算类型(整型 vs 浮点)、操作数取值以及是否启用特定检查机制。
整数运算:溢出静默发生,不报错
Java 的 int、long 等整数类型使用二进制补码表示,加减乘等运算发生溢出时,结果自动截断并保持在该类型范围内,不会抛异常,也不会警告。
-
例如:
int max = Integer.MAX_VALUE; System.out.println(max + 1);输出-2147483648(即Integer.MIN_VALUE) - 这种行为符合 JVM 规范,是确定且可预测的,但容易引发逻辑错误
- 如需检测溢出,应使用
Math.addExact()、Math.multiplyExact()等方法,它们在溢出时抛出ArithmeticException
浮点运算:遵循 IEEE 754,用特殊值表示异常
float 和 double 运算不抛异常,而是返回预定义的特殊值:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
0.0 / 0.0→NaN(Not-a-Number),所有含NaN的比较都为false(包括NaN == NaN) -
1.0 / 0.0→Infinity;-1.0 / 0.0→-Infinity - 可用
Double.isNaN()、Double.isInfinite()主动检查这些状态
除零操作:整型报错,浮点返回无穷
这是最易混淆的一点:
立即学习“Java免费学习笔记(深入)”;
-
int a = 5 / 0;→ 编译通过,运行时抛出ArithmeticException: / by zero -
double b = 5.0 / 0.0;→ 结果为Infinity,不抛异常 - 注意:
0 / 0(整型)也抛ArithmeticException;而0.0 / 0.0得NaN
主动防护建议
不要依赖运算符自动报错,应在关键计算处自行校验:
- 对用户输入或外部数据做范围检查(如确保除数非零、指数不过大)
- 敏感计算优先使用
Math.*Exact()方法捕获整数溢出 - 浮点计算后用
isFinite()或isNaN()验证结果有效性 - 必要时启用 JVM 参数
-XX:+CheckJNINatives(仅限 JNI 场景)或使用静态分析工具(如 Error Prone)检测潜在溢出

















