直接用(int)longvalue强转存在静默截断风险,必须校验是否在integer.min_value到integer.max_value范围内;推荐使用math.tointexact()或封装安全工具方法,并在编译期和静态检查中拦截未校验转换。

直接用 (int)longValue 强转存在静默截断风险,必须在转换前显式校验是否在 int 取值范围内(Integer.MIN_VALUE 到 Integer.MAX_VALUE)。
用 Math.addExact / Math.subtractExact 辅助边界判断
避免手动写 longValue Integer.MAX_VALUE 这类易错表达式。更安全的方式是复用 JDK 内置的溢出检测逻辑:
- 检查是否 ≤
Integer.MAX_VALUE:用Math.subtractExact(longValue, Integer.MAX_VALUE) - 检查是否 ≥
Integer.MIN_VALUE:用Math.subtractExact(longValue, Integer.MIN_VALUE) >= 0 - 或更直观地:先尝试
Math.toIntExact(longValue)—— 它内部已做完整校验,超出直接抛ArithmeticException
封装成可复用的工具方法
把校验逻辑收拢,降低误用概率:
public static int safeLongToInt(long value) {
if (value Integer.MAX_VALUE) {
throw new IllegalArgumentException("long value " + value + " out of int range");
}
return (int) value;
}
或更推荐使用 JDK 自带方法:
public static int safeLongToInt(long value) {
return Math.toIntExact(value); // JDK 8+
}
在关键路径上启用编译期/静态检查
仅靠运行时校验不够。可在开发阶段提前拦截:
- 启用
-Xlint:cast编译选项,部分 IDE 会提示潜在不安全强转 - 使用静态分析工具(如 SpotBugs、ErrorProne),配置规则检测裸
(int)longExpr - 在 CI 流程中集成 Checkstyle 或 PMD,自定义规则禁止未校验的 long→int 强转
注意包装类型与自动拆箱场景
防御性不止针对原始类型。以下写法同样危险:
-
int x = someLongObject.intValue();——Long.intValue()也是静默截断 int y = someLong; // Long → long → int,中间隐式拆箱+强转- 应统一走
Math.toIntExact(someLong.longValue())或显式判空+校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











