math.subtractexact通过提前判断符号位关系检测int/long减法溢出,越界抛arithmeticexception;不支持float/double;与静默回绕的普通减法不同,适用于安全敏感场景。

Math.subtractExact 通过在执行减法后立即检查结果是否发生整数溢出,来检测减法运算是否越界。
它只对 int 和 long 类型有效
该方法提供两个重载版本:subtractExact(int, int) 和 subtractExact(long, long)。不支持 float 或 double,因为浮点数的“溢出”行为不同(会返回 Infinity),且 Java 没有为浮点类型定义 exact 版本。
- 对 int:若
a - b超出 [-2³¹, 2³¹−1] 范围,抛出ArithmeticException - 对 long:若结果超出 [-2⁶³, 2⁶³−1],同样抛异常
底层靠数学关系判断溢出,不依赖实际结果
它不是先算出结果再比大小,而是利用符号位和操作数关系提前判断——例如对 int 减法:
- 若被减数为正、减数为负,结果可能上溢 → 检查
a > Integer.MAX_VALUE + b等价变形 - 若被减数为负、减数为正,结果可能下溢 → 检查
a - 标准库实现用位运算或条件判断规避真实计算前的溢出风险
使用时需配合异常处理
因为一旦溢出就抛 ArithmeticException,所以必须用 try-catch 包裹,或明确接受程序中断。
- 推荐场景:金融计算、索引边界校验、协议解析中要求严格精度的减法
- 避免场景:高频循环中的普通减法(异常开销大,可用其他方式预检)
- 示例:Math.subtractExact(2147483647, -1) 直接抛异常,因为 2147483647 − (−1) = 2147483648 > MAX_VALUE
它和普通减法的区别在于“零容忍”
普通 - 运算对溢出是静默的(如 Integer.MAX_VALUE - (-1) 得到 Integer.MIN_VALUE),而 subtractExact 把溢出视为错误而非 wraparound 行为。
- 适合需要确定性、强一致性的逻辑,比如安全敏感或数据校验场景
- 不是性能优化工具,而是健壮性增强手段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











