math.tointexact 用于将 long 安全转为 int,超出 int 范围时抛出 arithmeticexception;而 (int) 强转会静默截断导致隐蔽错误,如 3000000000l 转为 -1294967296。

Math.toIntExact 是 Java 8 引入的工具方法,专门用于将 long 安全转为 int,并在值超出 int 范围时主动抛出异常,避免静默截断导致的隐蔽错误。
为什么不用 (int) 强转?
直接强制转换如 (int) 3000000000L 会丢弃高位,结果是 -1294967296(即模 2³² 截断),毫无提示。这种“静默溢出”极易引发逻辑错误,且难以排查。
toIntExact 的核心行为
该方法内部会先判断 long 值是否严格落在 Integer.MIN_VALUE(-2³¹)到 Integer.MAX_VALUE(2³¹−1)之间:
- 在范围内 → 返回对应
int值 - 超出范围 → 立即抛出
ArithmeticException(异常信息含具体数值)
典型使用场景与写法
适合明确要求“必须可表示为 int”的业务逻辑,例如数组索引、计数器上限校验、协议字段解析等:
- 解析 JSON 或数据库中可能超长的整数字段时,用它代替
Long.intValue() - 做下标访问前校验:
int idx = Math.toIntExact(rowId); list.get(idx); - 配合 Optional 或 try-catch 处理异常,体现“失败即中断”的设计意图
替代方案对比
若需默认值而非异常,可自行封装:
public static int toIntOrNull(long value) {
return (value Integer.MAX_VALUE)
? -1 : (int) value;
}
但推荐优先用 toIntExact,让溢出问题暴露在开发/测试阶段,而不是潜伏在线上。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











