最安全的方式是先校验非空和空白再转换,推荐封装带默认值的工具方法:检查 str == null || str.trim().isempty(),再 try-catch parseint(),同时防御空、空白、非法字符及溢出。

Java 字符串转数字最安全的方式不是直接调用 Integer.parseInt(),而是先校验非空、再判断是否为有效数字格式,否则必然抛 NumberFormatException。
用 Integer.parseInt() 前必须检查空值和空白字符
空字符串 ""、纯空白字符串 " \t\n" 或 null 直接传给 Integer.parseInt() 都会立即崩溃。JDK 不做任何容错处理。
- 永远不要写
Integer.parseInt(str),除非你 100% 确保str是非空非空白的合法数字字符串 - 推荐先用
str == null || str.trim().isEmpty()判断,再进转换逻辑 -
str.trim()很关键:它能清除首尾空格、制表符、换行符,避免" 123 "被误判为非法
推荐使用 Integer.valueOf() 替代 parseInt()?不,本质一样
Integer.valueOf(String) 内部就是调用 parseInt(),同样抛 NumberFormatException,且返回的是 Integer 对象(有自动装箱开销)。它并不解决空值或格式问题。
- 二者在异常行为、空值容忍度、空白字符处理上完全一致
- 若需返回基本类型
int,用parseInt()更明确;若需Integer且想利用缓存(-128~127),valueOf()略优,但跟空字符串处理无关 - 别指望换函数就能绕过校验——核心是前置判断,不是选哪个 API
更健壮的做法:封装一个带默认值的工具方法
业务代码里反复写空判断 + try-catch 太啰嗦,建议抽成工具方法,明确表达“转不了就给默认值”的意图。
立即学习“Java免费学习笔记(深入)”;
public static int parseIntOrDefault(String str, int defaultValue) {
if (str == null || str.trim().isEmpty()) {
return defaultValue;
}
try {
return Integer.parseInt(str.trim());
} catch (NumberFormatException e) {
return defaultValue;
}
}
- 这个方法同时防御了
null、空白字符串、非数字字符(如"12a"、"abc")三类常见错误 - 注意:
trim()必须放在parseInt()之前,否则" 456 "会报错 - 如果需要区分“空”和“非法格式”,可改用返回
Optional<integer></integer>,但多数 Web/DTO 场景用默认值更直觉
数字范围溢出时也会抛 NumberFormatException,别只盯着空字符串
很多人以为只要过了空值检查就万事大吉,但 "2147483648"(超过 Integer.MAX_VALUE)或 "-2147483649" 同样触发相同异常——它其实是“格式不合法”的广义体现。
-
NumberFormatException的语义是“字符串无法表示为指定类型的值”,涵盖:空、空白、含非法字符、超范围、纯符号(如"+")、科学计数法("1e2")等 - 如果你的输入可能超范围,又不想崩,仍得靠 try-catch 捕获并降级处理
- 对超大数,考虑用
BigInteger或Long.parseLong()(配合更大范围校验)
真正容易被忽略的点是:空字符串只是冰山一角,所有非标准数字表示都归在同一异常下;而生产环境里,前端传参、配置文件读取、日志解析等场景,往往混着空、空格、乱码、超长数一起出现——只防空,等于没防。











