Java强制转换需谨慎处理校验、范围、精度和空值;浮点转整数默认向零截断,四舍五入用Math.round(),金融场景必须用BigDecimal并传字符串构造。

Java 强制转换不是“写个括号就完事”,而是把校验、范围、精度、空值等责任全交给开发者。用错一次,可能让金额少算几毛、ID翻转成负数、或上线后突然崩溃。关键不在“能不能转”,而在“转得稳不稳”。
浮点数转整数:别裸强转,先决定要什么结果
直接写 (int) 3.9 得到 3,(int) -3.9 得到 -3——这是向零截断,不是四舍五入,也不检查溢出。
- 需要四舍五入:用 Math.round(),例如 int n = Math.round(123.6f) → 124
- 金融/高精度场景:必须用 BigDecimal,构造时传字符串(new BigDecimal("123.45")),再调 setScale(0, RoundingMode.HALF_UP)
- 确认小数部分恒为 0 才可裸转,比如解析时间戳毫秒值后转 int,但需先判断 d
字符串转数字:永远假设输入不可信
Integer.parseInt("abc") 不报编译错,一运行就崩。用户输入、配置项、HTTP 响应都可能含非法格式。
- 提前粗筛:用正则 str.matches("-?\d+") 判断是否纯整数;str.matches("-?\d*\.?\d+") 粗略匹配数字
- 必须包裹 try-catch:捕获 NumberFormatException,给默认值或记录日志,不往上抛
- 封装工具方法:如 safeParseInt(String s, int defaultValue),内部统一处理 null、空串、异常
引用类型向下转型:instanceof 不是可选项,是必选项
Object obj = new String("ok"); String s = (String) obj; 看似安全,但若 obj 实际是 Integer 或 null,运行时立刻抛 ClassCastException 或 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- 转型前必加 if (obj instanceof String),注意 instanceof null 返回 false,天然防 NPE
- Java 14+ 可用模式匹配简化:if (obj instanceof String s) { /* s 已声明并赋值 */ }
- 避免从 List 或 Map
取值后直接强转,优先用泛型声明 + 明确类型存取
基本类型降级:警惕静默溢出和符号翻转
byte b = (byte) 200; 结果是 -56;int i = (int) 3_000_000_000L; 结果是 -1294967296——没有警告,没有异常,只有错误数据在后台悄悄累积。
- 涉及累计、ID、时间戳等场景,改用 long 或 BigInteger
- 需转小类型时,优先用 Math.toIntExact(long),溢出会明确抛 ArithmeticException
- 手动校验范围:if (l >= Byte.MIN_VALUE && l 再转
不复杂但容易忽略:强制转换的本质是“我清楚风险,我来担责”。每次写 (Type)xxx,都该问自己一句——这个值真在我预期范围内吗?它会不会是 null?有没有更安全的替代方案?


















