字符串转数字抛出numberformatexception,说明输入不符合目标数字格式要求,需提前校验空值、空白、非法字符、范围及进制等,推荐使用封装的safeparseint返回optional进行安全转换。

字符串转数字时抛出 NumberFormatException,说明当前字符串**不符合目标数字类型的格式要求**。这不是代码写错了,而是数据本身有问题——比如空串、纯空白、带字母、含多余符号、超出范围,或用了错误的进制解析。关键不是“怎么 catch”,而是“怎么提前识别并处理异常输入”。
检查字符串是否为空或仅空白
这是最常见原因:传入 null、"" 或 " " 时,Integer.parseInt(" ") 直接报错。
- 用
str == null || str.trim().isEmpty()先判断 - 别依赖
parseInt自动去空格——它不处理首尾空格,也不接受空串 - 示例:
Integer.parseInt(" 123 ")会成功,但Integer.parseInt(" ")会失败
确认字符串只含合法数字字符(及可选符号)
parseInt 只接受十进制整数格式:可选开头的 + 或 -,后面跟 0–9 的数字。任何字母(如 "12a")、小数点("12.5")、逗号("1,234")、中文数字("一二三")都会触发异常。
- 用正则快速过滤:
str.matches("-?\d+")判断是否为合法整数字符串 - 若需支持小数,改用
Double.parseDouble(),但注意它仍不接受逗号、空格或单位(如"12.5kg") - 业务中常见脏数据:用户输入“暂无”、“—”、“N/A”,需在转换前统一清洗或映射
注意数值范围和进制参数
即使全是数字,也可能因超出类型范围或进制误用而失败。
-
Integer.parseInt("2147483648")报错:超出了int最大值2147483647 -
Integer.parseInt("100", 2)表示二进制,结果是 4;但Integer.parseInt("2", 2)就非法——二进制里不能有数字 2 - 大数建议用
BigInteger或Long.parseLong(),并捕获异常后降级处理
推荐安全转换写法(不依赖 try-catch 主流程)
把异常控制在边界,不让它扩散到核心逻辑:
- 封装工具方法,返回
Optional<integer></integer>:public static Optional<integer> safeParseInt(String s) {<br> if (s == null || s.trim().isEmpty()) return Optional.empty();<br> try { return Optional.of(Integer.parseInt(s.trim())); }<br> catch (NumberFormatException e) { return Optional.empty(); }<br>}</integer> - 调用时用
safeParseInt(str).orElse(0)或.orElseThrow(() -> new BusinessException("非法数字")) - 避免在循环里对每个字符串都写 try-catch——封装一次,复用 everywhere
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











