ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Java Long 直接转 int 的风险

Java Long 直接转 int 的风险 有严重风险主要是数据溢出Overflow导致精度丢失且 Java 默认不会抛出异常而是静默截断。1. 核心风险静默数据丢失位宽差异long是 64 位int是 32 位。转换行为强制类型转换(int) longValue会直接丢弃高 32 位数据只保留低 32 位。后果如果long值超出int范围-2^31 ~ 2^31-1转换后的值会变成一个完全错误的数字通常是负数或很小的正数且不会抛出异常。2. 代码示例longlargeLong3_000_000_000L;// 超出 int 最大值 (约 21.4 亿)intwrongInt(int)largeLong;// 静默转换System.out.println(wrongInt);// 输出-1294967296 (数据完全错误但程序继续运行)3. 安全转换方案方案 A使用Math.toIntExact()(推荐Java 8)这是最安全的做法如果超出范围会直接抛出ArithmeticException避免错误数据流入业务逻辑。try{intsafeIntMath.toIntExact(largeLong);}catch(ArithmeticExceptione){// 处理溢出错误记录日志或返回错误码log.error(long 转 int 溢出,e);}方案 B手动范围检查如果不方便使用工具方法必须在转换前显式判断。if(largeLongInteger.MAX_VALUElargeLongInteger.MIN_VALUE){intsafeInt(int)largeLong;}else{// 处理溢出情况thrownewIllegalArgumentException(数值超出 int 范围);}4. 常见高危场景在以下场景中long转int极易引发线上故障需格外谨慎金额计算分币单位累计后容易超过 21 亿。时间戳毫秒级时间戳早已超过int范围。分布式 ID雪花算法等生成的 ID 通常为long强转int会导致冲突或查询失败。数组索引虽然数组索引必须是int但如果用long计数后再转int用于索引可能触发ArrayIndexOutOfBoundsException或访问错误位置。5. 建议默认保持long除非确定数据量极小如状态码、枚举值否则建议全程使用long。接口兼容性如果对接老旧系统必须用int务必在边界处做校验和异常处理。代码审查在 Code Review 中(int)强制转换应作为重点检查项。
返回列表