Math.addExact()是Java 8引入的严格加法工具,溢出时抛ArithmeticException,仅支持int/long类型,需避免隐式溢出、配合原子类保障并发安全。
math.addexact() 是 java 8 引入的严格算术工具,专为“宁可失败、绝不撒谎”的关键计数场景设计。它在整数加法结果溢出时直接抛出 arithmeticexception,彻底杜绝 int 或 long 累加时因回绕(wraparound)导致的静默错误——比如计数器从 integer.max_value 加 1 变成 integer.min_value 这种灾难性行为。
明确适用类型与基本用法
该方法仅支持 int 和 long 两种原始类型,不接受包装类或其它数值类型:
-
Math.addExact(int x, int y)—— 溢出则抛ArithmeticException -
Math.addExact(long x, long y)—— 同理,检查long范围(±9,223,372,036,854,775,807) - 不提供
short、byte或char版本;若需处理,应先提升为int并自行校验范围
嵌入关键计数器更新逻辑
不要在业务循环中裸写 counter++ 或 counter += delta。应封装累加操作,强制失败反馈:
- 用
try-catch显式捕获溢出异常,并触发告警、降级或人工干预 - 示例:高可靠消息计数器
private int messageCount = 0;
public void recordMessage() {
try {
messageCount = Math.addExact(messageCount, 1);
} catch (ArithmeticException e) {
throw new IllegalStateException("Critical counter overflow: messageCount=" + messageCount, e);
}
}
替代隐式转换,避免中间溢出陷阱
常见误区是先做运算再调用 addExact,例如 Math.addExact(a + b, c) —— 此时 a + b 已发生静默溢出,addExact 校验的是错误值。正确做法是链式调用或分步校验:
- ✅ 正确:
int sum = Math.addExact(Math.addExact(a, b), c); - ❌ 错误:
int sum = Math.addExact(a + b, c);(a + b先溢出) - 对多操作累加,建议用循环+逐次
addExact,而非先求和再校验
配合原子类与并发安全使用
Math.addExact() 本身无并发能力。若计数器被多线程更新,需结合线程安全机制:
立即学习“Java免费学习笔记(深入)”;
- 用
AtomicInteger/AtomicLong的accumulateAndGet或updateAndGet,传入基于addExact的函数 - 示例:
private final AtomicInteger safeCounter = new AtomicInteger(0);
public int incrementSafely() {
return safeCounter.accumulateAndGet(1, (current, inc) -> {
try {
return Math.addExact(current, inc);
} catch (ArithmeticException e) {
throw new RuntimeException("Overflow on atomic counter update", e);
}
});
}


















