Math.multiplyExact()是Java 8引入的安全乘法方法,支持int和long类型,溢出时抛ArithmeticException;不支持float/double及short/byte/char(需先转int);比手动检测更简洁可靠,推荐配合try-catch处理溢出场景。

Math.multiplyExact() 是 Java 8 引入的安全乘法工具,专为整数类型设计,能在结果超出目标类型取值范围时立即抛出 ArithmeticException,避免静默溢出——这是普通 * 运算符做不到的。
支持的类型与基本用法
该方法提供 int 和 long 两个重载版本:
-
Math.multiplyExact(int x, int y):两 int 相乘,结果仍为 int;溢出则抛ArithmeticException -
Math.multiplyExact(long x, long y):两 long 相乘,结果为 long;溢出同理抛异常
例如:
// 正常情况int result1 = Math.multiplyExact(1000, 2000); // 2_000_000,成功
// 溢出情况(int 最大值为 2,147,483,647)int result2 = Math.multiplyExact(100_000, 100_000); // 抛 ArithmeticException
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
替代手动溢出检测,更简洁可靠
过去常用位运算或条件判断检测 int 溢出(如检查符号、比较除法结果),逻辑复杂且易出错。而 multiplyExact() 封装了 JVM 层级的溢出检查,一行代码即完成安全计算。
- 无需自己写
if (a != 0 && b > Integer.MAX_VALUE / a)这类易漏边界(如负数、零)的判断 - 底层由 HotSpot 优化,性能接近原生乘法,远优于反射或包装类方案
配合 try-catch 处理业务逻辑
当乘法结果可能溢出且需差异化响应时,应显式捕获异常:
立即学习“Java免费学习笔记(深入)”;
try {
long product = Math.multiplyExact(a, b);
processValidResult(product);
} catch (ArithmeticException e) {
handleOverflowCase(); // 如降级为 BigInteger、记录告警、返回默认值等
}
注意:
– 不要忽略异常或仅打印堆栈;
– 若上下文明确不会溢出(如已校验输入范围),可不加 try-catch,让异常快速失败(fail-fast)暴露问题。
不支持 float/double,也不适用于其他数值类型
Math.multiplyExact() 仅针对 int 和 long。对浮点数,溢出产生 Infinity 或 NaN,属于 IEEE 754 行为,不抛异常;
对 short、byte、char,需先提升为 int 再调用,否则编译不通过:
- ❌
Math.multiplyExact((short)10, (short)20)— 编译错误 - ✅
int r = Math.multiplyExact((int)s1, (int)s2)— 显式转为 int 后调用

















