Java基本类型强制转型不检查溢出,仅位截断;必须转换前校验范围,优先使用Math.toIntExact等安全方法,警惕有符号/无符号混淆及外部输入溢出风险。

Java 基本数据类型强制转型本身不检查溢出,只做位截断或重解释——值错不会报错,但业务逻辑会悄然崩坏。避免溢出的关键不是“怎么转”,而是“转之前就拦住非法值”。
转换前必须做范围校验
不能依赖强转自动兜底,所有缩容转换(如 long → int、double → int、int → byte)都需手动比对边界:
- 转 byte:检查
value >= Byte.MIN_VALUE && value - 转 int(尤其来自 long):用
value >= Integer.MIN_VALUE && value - 浮点转整数:先
Double.isFinite(d)排除 NaN/无穷,再校验是否落在Integer.MIN_VALUE到Integer.MAX_VALUE之间
优先使用带溢出检查的工具方法
JDK 提供了语义明确、失败即止的安全替代方案,比裸强转更可靠:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
Math.toIntExact(long):超 int 范围直接抛ArithmeticException -
Math.addExact(a, b)、multiplyExact()等:用于中间运算,防止先溢出再转 - 字符串转数字用
Integer.parseInt(str)或Long.parseLong(str),非法格式立刻暴露
警惕有符号与无符号语义混用
Java 没有无符号基本类型(char 除外),但协议/硬件常传 uint8、uint16 等数据:
- 读到字节
0xFF,直接(byte)0xFF得到的是-1;若本意是无符号 255,应写成0xFF & 0xFF(得 int 255) - short 转 char 时,若原值为负,直接强转会误解释为非法 Unicode 码点,应先无符号扩展再转
外部输入场景要前置拦截
数据库 ID、JSON 数字、配置项等外部数据默认可能是 Long 或 Double,不能盲目强转:
- 毫秒时间戳不要直接
(int)timestamp,2038 年后必然溢出;应先除以 1000 得秒级,再判断是否在 int 范围内 - 配置解析时,读取
maxRetryCount=5000就立刻校验是否 ≤Integer.MAX_VALUE,而不是等到强转才崩溃 - Pandas 或 Jackson 解析的数值常默认为 Double,取出后别直接
(int)obj,先确认类型再处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










