Math.multiplyExact()是Java 8引入的溢出检测乘法方法,对int或long运算,溢出时抛出ArithmeticException,不支持short/byte/float/double,性能接近普通乘法。

Math.multiplyExact() 是 Java 8 引入的工具方法,专用于整数乘法运算时检测溢出——一旦结果超出对应类型(int 或 long)的取值范围,它会立即抛出 ArithmeticException,而不是静默回绕(如普通 * 运算那样)。这在金融计算、安全敏感或数据校验场景中非常关键。
适用类型与基本用法
该方法有两组重载:
-
Math.multiplyExact(int x, int y):对int运算,溢出时抛出ArithmeticException("integer overflow") -
Math.multiplyExact(long x, long y):对long运算,溢出时抛出ArithmeticException("long overflow")
注意:不支持 short、byte、char 或 float/double;传入这些类型会触发编译错误或自动提升导致语义变化(例如 short 被转为 int 后调用 int 版本)。
替代普通乘法,显式捕获溢出
把原来可能出错的 * 替换为 multiplyExact(),并配合 try-catch 处理异常:
int a = Integer.MAX_VALUE;
int b = 2;
try {
int result = Math.multiplyExact(a, b); // 抛出 ArithmeticException
} catch (ArithmeticException e) {
System.err.println("乘法溢出:" + e.getMessage());
// 可降级处理,如返回默认值、记录日志或抛出自定义业务异常
}
相比手动检查(如判断 a != 0 && b > Integer.MAX_VALUE / a),这种方式更简洁、无分支预测开销,且语义明确。
与包装类和泛型结合需谨慎
若变量是 Integer 类型,直接传入不会自动拆箱失败,但要注意 null 值:
-
Integer x = null; Math.multiplyExact(x, 5);→ 触发NullPointerException(先拆箱) - 建议先判空,或统一使用基本类型参数
- 泛型无法直接约束
multiplyExact(它不是泛型方法),需按具体类型分别调用
性能与适用边界
该方法底层由 JVM 内联优化(HotSpot 中已高度优化),性能接近普通乘法,远优于手工溢出检查。但它只适用于**需要强一致溢出控制**的场景:
- ✅ 适合:金额累加、索引计算(如数组偏移)、协议长度校验
- ❌ 不适合:高频循环中非关键计算(此时溢出本就不应发生,可改用
long或BigInteger) - ⚠️ 注意:它不解决“逻辑溢出”(如业务上不允许超过 100 万元),仅检测硬件级整数溢出

















