Java整型溢出风险源于计算过程隐式截断与字面量类型误判;应使用L后缀、显式类型转换、Math.exact系列、Objects.hash及位运算等手段规避。

整型变量赋值本身不会溢出,真正危险的是“计算过程中的隐式运算”和“字面量类型误判”。Java 在赋值时只检查右侧表达式结果是否在目标类型范围内,但若中间计算已按小类型完成,结果就不可逆了。
字面量要带类型后缀
Java 编译器对数字字面量默认按 int 处理(除非超出 int 范围才自动升为 long)。所以:
- 错误写法:
long x = 2147483647 + 1;→ 先算 int 加法,结果是 -2147483648,再赋给 long - 正确写法:
long x = 2147483647L + 1;或long x = (long)2147483647 + 1; - 时间常量别写成
60 * 60 * 24 * 1000,而要写成60L * 60 * 24 * 1000,确保乘法链从 long 开始
外部输入参与运算前先转 long
用户传入的 int 值(如分页 offset、持续分钟数、ID 差值)看似安全,但上线后可能突增。一旦参与乘加运算,极易溢出:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 别写:
new Date(now + minutes * 60 * 1000) - 改写:
new Date(now + (long) minutes * 60 * 1000)或更优:TimeUnit.MINUTES.toMillis(minutes) - 构造对象时,对关键字段做范围校验,超限直接拒绝或抛
IllegalArgumentException
用 Math.exact 系列替代静默计算
当业务要求“绝不容忍错值”(如计费、库存、序列生成),靠类型升级不够——它只是把错误延后或掩盖。应主动拦截:
立即学习“Java免费学习笔记(深入)”;
-
int sum = Math.addExact(a, b);—— 溢出即抛ArithmeticException - 同理有
Math.multiplyExact、Math.subtractExact、Math.toIntExact(long) - 异常信息明确含
integer overflow,日志可直接定位问题源头
避免在 hashCode 或关键逻辑里手动算溢出式
自定义 hashCode() 时,常见写法 31 * a + b 极易因 a 或 b 溢出导致哈希失真:
- 优先用
Objects.hash(a, b),它内部做了类型适配与空值防护 - 若必须手写,对中间结果加判断:
int h = 1; h = 31 * h + Objects.hashCode(field);比直接累加更稳 - 对时间戳、大 ID 等字段,在
hashCode()中用位异或压缩:(int)(value ^ (value >>> 32)),不依赖算术

















