java整数溢出本质是静默回绕,应优先升级类型(如int→long)、关键逻辑用math.exact系列主动抛arithmeticexception,警惕循环/时间戳/用户输入等隐性溢出点,浮点溢出则产生infinity/nan需单独检测。

Java 数值溢出问题本质是整数运算结果超出类型表示范围时的静默回绕(wrap-around),不会抛异常,但结果完全错误。处理关键不是“阻止发生”,而是提前预防、合理选型、必要时主动拦截。
优先升级数据类型,避免小类型硬扛大数值
多数溢出源于过早选用 int、short 或 byte。除非有明确约束(如协议字段、内存敏感场景),否则应按需升级:
- 计数器、ID、时间戳差值、分页偏移量等,直接用
long替代int; - 数组长度、集合大小等虽由 API 返回
int,但若处理超 2GB 数据,需检查是否可能越界(例如list.size()接近Integer.MAX_VALUE时再做加法); - 避免用
short或byte做中间计算——它们在运算中自动提升为int,反而引入隐式转换风险。
关键逻辑必须校验:用 Math.exact 系列方法
Java 8+ 提供的 Math.addExact、Math.multiplyExact、Math.toIntExact 等方法,在溢出时直接抛 ArithmeticException,且性能接近原生运算(HotSpot 内联优化)。这是最推荐的主动防御方式:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 只支持
int和long重载,short/byte需先转成int再调用; - 异常信息含 “integer overflow”,日志中可快速定位;
- 不要用
try-catch包裹普通加法来自行判断——手写边界条件(如a > Integer.MAX_VALUE - b)极易漏掉负数或零值场景,且冗余低效。
警惕隐性溢出点:循环、差值、用户输入
溢出常发生在看似安全的地方:
for (int i = start; i :若 <code>end == Integer.MAX_VALUE且step > 0,i可能回绕成负数,导致死循环;-
int timeout = (int)(System.currentTimeMillis() - startTime):两个long时间戳相减结果若超int范围,强转即丢精度; - 所有来自配置、用户输入、外部接口的整数,只要参与累加、乘法或作为索引,都应评估是否接近边界,必要时用
Math.addExact或升为long。
浮点溢出与整数不同,需单独检测
float 和 double 溢出不回绕,而是产生 Infinity 或 NaN:
- 用
Double.isInfinite(x)或Float.isNaN(x)显式判断; - 这和整数溢出机制完全不同,不能混用同一套防护逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










