Java中应使用Math类的Exact方法(如toIntExact、addExact)替代裸强转和基础运算,使溢出触发ArithmeticException而非静默错误,再按业务场景捕获处理。

Java 中通过 Math 类处理类型转换溢出,核心是**用带 Exact 后缀的方法替代裸强转或普通运算**,让溢出从“静默错误”变成“可捕获的异常”,从而在业务逻辑中主动控制风险。
用 toIntExact、toLongExact 替代 (int)、(long) 强转
原始字符串或 long 值转 int 时,直接 (int)l 会丢高位、绕回负数,毫无提示。而 Math.toIntExact(long) 在值超出 [-2147483648, 2147483647] 时立即抛 ArithmeticException:
- 安全写法:
int id = Math.toIntExact(resultSet.getLong("id")); - JSON 解析后:
int count = Math.toIntExact(JsonParser.getLong("total")); - 时间戳别强转:
long ts = System.currentTimeMillis(); // 保持 long,不转 int;若真需 int 秒级,用Math.toIntExact(ts / 1000)并捕获异常
用 addExact、multiplyExact 等替代基础算术运算
两个 int 相加、相乘可能溢出,但 a + b 不报错,Math.addExact(a, b) 会在结果越界时中断执行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 累加计数器:
total = Math.addExact(total, nextValue);(放在循环里逐次校验) - 金额计算:
int finalPrice = Math.multiplyExact(unitPrice, quantity); - 避免嵌套错误:
Math.addExact(a + b, c)是错的——a + b已溢出;应写成Math.addExact(Math.addExact(a, b), c)
注意参数类型和 null 安全边界
Math 的 Exact 方法只对 int 和 long 生效,且不处理 null:
立即学习“Java免费学习笔记(深入)”;
- 包装类要先判空:
if (obj != null) { int x = Math.toIntExact(((Long) obj).longValue()); } - 混用类型需显式标记:
Math.multiplyExact(10L, x)调用 long 版本;Math.multiplyExact(10, x)是 int 版本 - short/byte 传入会自动提升为 int,走 int 版本;如需 long 运算,至少一个操作数加
L
异常不是 bug,而是业务信号
ArithmeticException 是运行时异常,编译器不强制捕获,但你应该明确响应它:
- 关键路径(如支付、库存扣减):catch 后包装为业务异常,例如
throw new InvalidAmountException("金额超出系统支持范围", e); - 批量导入场景:记录日志 + 跳过当前条目,避免整批失败
- 切忌吞掉异常或返回默认值(如 0),否则又回到静默错误

















