Java字符串转基本类型必须先校验、再解析、后验证,整数需防空去空格控范围,浮点需防精度丢失和特殊值,布尔与字符需按业务明确定义,推荐用NumberUtils或Optional封装。

不能直接强转,必须先校验、再解析、后验证。Java 没有通用安全转换方法,每种基本类型都要按其语义和边界单独处理。
整数类型(int / long / short / byte)
核心是防空、去空格、控范围:
- 先判空并 trim:
str == null || str.trim().isEmpty() - 用
Integer.parseInt(str.trim())解析,但不裸用——它不检查溢出 - 超范围风险必须主动拦截:比如 int 最大为 2147483647,字符串
"2147483648"会抛NumberFormatException;更稳妥的做法是用BigInteger加载后调intValueExact(),异常即说明越界 - 若需支持十六进制等进制,明确传参:
Long.parseLong("FF", 16)
浮点类型(double / float)
警惕精度丢失、特殊值和静默失效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Double.parseDouble()支持"1.2e-3"和"Infinity",但业务中常需排除这些 - 解析后建议加校验:
Double.isFinite(d)确保是普通有限值 - 金额、计费等场景禁用 double/float,改用
new BigDecimal(str);避免BigDecimal.valueOf(Double.parseDouble(str))这类中间失真链路 - 不要用
(float) new BigDecimal("0.1").doubleValue()—— 二进制浮点本质决定它不等于 0.1
布尔与字符类型
默认行为易引发逻辑误判,需按业务明确定义:
立即学习“Java免费学习笔记(深入)”;
-
Boolean.parseBoolean("false")返回 false,Boolean.parseBoolean("0")也是 false,且不抛异常——这不是缺陷,是设计意图(只认字面量"true") - 如需支持
"1"/"0"或"yes"/"no",应手动比对:"true".equalsIgnoreCase(s) || "1".equals(s) - 转 char 不是数值转换:
s.length() == 1 ? s.charAt(0) : throw ...;别用(char) Integer.parseInt(s),那是 ASCII 码误操作
统一建议:封装 + 显式语义
避免每个地方重复写 try-catch 和 trim:
- 推荐用 Apache Commons Lang 的
NumberUtils.toInt(str, -1)或NumberUtils.isCreatable(str),内部已处理空、空格、格式 - 自封装时返回
Optional<Integer>,调用方必须显式处理“无值”情况,比默认值更能暴露数据问题 - 来自前端或 JSON 的字符串要额外注意:JavaScript 可能将大整数转成科学计数法(如
"1e21"),Java 解析后可能精度丢失或溢出

















