Java中int累加会静默回绕,应使用a>0&&b>0&&a>Integer.MAX_VALUE-b预检溢出,仅对同号数有效,禁止先加后判或用long转换。

在 Java 中,直接对 int 类型做累加(如 a + b)不会抛异常,而是静默回绕(wraparound),导致难以排查的逻辑错误。利用 Integer.MAX_VALUE 手动预检是一种常见且轻量的防御手段,但需注意边界条件和语义正确性。
预检的核心逻辑:加法溢出的数学判定
两个正整数相加溢出,当且仅当:a > 0 && b > 0 && a > Integer.MAX_VALUE - b
这个不等式等价于 a + b > Integer.MAX_VALUE,但避免了实际执行加法——否则就失去预检意义了。
- 只对同号操作数有意义:两负数相加可能下溢(小于
Integer.MIN_VALUE),需单独检查a - 一正一负或含零时,结果一定在
[Integer.MIN_VALUE, Integer.MAX_VALUE]范围内,无需检查 - 推荐封装为工具方法,避免重复逻辑
安全累加的实用写法示例
以下是一个兼顾可读性与健壮性的静态辅助方法:
public static int safeAdd(int a, int b) {
if (a > 0 && b > 0 && a > Integer.MAX_VALUE - b) {
throw new ArithmeticException("Integer overflow: " + a + " + " + b);
}
if (a < 0 && b < 0 && a < Integer.MIN_VALUE - b) {
throw new ArithmeticException("Integer underflow: " + a + " + " + b);
}
return a + b;
}调用时直接替换原加法:int sum = safeAdd(x, y); —— 溢出时明确失败,而非静默错误。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
更简洁的替代方案:使用 JDK 内置方法
Java 8+ 提供了 Math.addExact(),内部实现与上述逻辑一致,且已充分测试:
立即学习“Java免费学习笔记(深入)”;
-
Math.addExact(a, b):溢出时抛ArithmeticException - 同理还有
Math.multiplyExact()、Math.subtractExact() - 无需自己维护边界逻辑,语义清晰,推荐优先使用
注意事项与常见误区
直接比较 a + b > Integer.MAX_VALUE 是错误的——此时加法已执行,可能已回绕,比较结果不可靠。
- 不要用
long中间转换再比对(如(long)a + b > Integer.MAX_VALUE),虽能工作但引入类型转换开销,且掩盖了设计意图 - 若业务允许溢出后取模(如哈希计算),应显式使用
Math.floorMod()或位运算,而非依赖静默回绕 - 在循环累加场景中,每次迭代都应检查,不能只检查初始值

















