Java字符串转基本类型无通用安全方案,须分类型处理null、空白、格式错误、溢出、精度丢失五类风险:先预处理(判空、trim),再解析(包装类parseXxx),最后校验(范围、有限性、业务语义)。

Java 中字符串转基本类型没有“一招通用”的安全做法,必须针对每种类型分别处理 null、空白、格式错误、溢出和精度丢失这五类风险。核心是:先预处理(判空、trim),再解析(用包装类 parseXxx),最后校验(范围、有限性、业务语义)。
整数类型(int / long / short / byte)
关键在防空、去空格、控范围:
- 先检查是否为空或纯空白:
str == null || str.trim().isEmpty() - 解析前建议 trim:
str.trim(),避免" 123 "直接抛异常 -
Integer.parseInt()等方法不检查溢出,"2147483648"会直接抛NumberFormatException;更稳妥的是用new BigInteger(str.trim()).intValueExact(),异常即说明越界 - 如需支持十六进制等进制,必须显式传参:
Long.parseLong("FF", 16)
浮点类型(double / float)
重点防范精度丢失、特殊值和静默失效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Double.parseDouble("Infinity")不报错,但业务中往往不能接受;解析后应加Double.isFinite(d)校验 - 金额、计费等场景禁用
double/float,改用new BigDecimal(str);切忌写成BigDecimal.valueOf(Double.parseDouble(str)),中间已失真 -
new BigDecimal("0.1").floatValue() != 0.1——这是二进制浮点本质决定的,不是 bug
布尔与字符类型
默认行为容易掩盖逻辑错误,必须按业务明确定义:
立即学习“Java免费学习笔记(深入)”;
-
Boolean.parseBoolean("0")返回false,且不抛异常;如需支持"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></integer>,调用方必须显式处理“无值”情况,比默认值更能暴露数据问题 - 来自前端或 JSON 的字符串要额外注意:JavaScript 可能将大整数转成科学计数法(如
"1e21"),Java 解析后可能精度丢失或溢出

















