避免 NumberFormatException 的核心是前置校验而非事后捕获:先用 Objects.nonNull 与 trim 判空,再用正则或 NumberUtils.isCreatable 校验格式,优先选用 NumberUtils.createInteger 等安全方法,封装统一工具类,慎用 try-catch 仅作兜底。

避免 NumberFormatException 的核心不是“等它发生再处理”,而是**在调用 parseInt()、parseDouble() 等方法前,主动拦截非法输入**。空值、空白、非数字字符、超范围数值都会触发该异常,需分层设防。
先做基础校验:非空 + 非空白 + 基本格式
很多崩溃其实源于最简单的疏忽——没检查 null 或纯空格字符串。这一步开销极小,却能挡住大量异常。
- 用
Objects.nonNull(str) && !str.trim().isEmpty()排除 null 和空白 - 对整数,可用
str.matches("-?\d+")初筛(注意:不校验溢出) - 对浮点数,用
str.matches("-?\d+(\.\d+)?")或更严谨的NumberUtils.isCreatable(str) - 别忘了进制问题:解析十六进制如
"0xFF"必须显式传参Integer.parseInt("0xFF", 16)
优先使用成熟工具类:NumberUtils 最省心
Apache Commons Lang 的 NumberUtils 是经过大量边界测试的工业级方案,比手写正则更可靠。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
NumberUtils.isCreatable(str)能同时识别"123"、"-45.67"、"+0.0"、"1.23e4",并拒绝"123."、"123abc"、" "、null - 转换时直接用
NumberUtils.createInteger(str)或createDouble(str),失败返回null,不抛异常 - 引入依赖:
org.apache.commons:commons-lang3:3.14.0+
封装安全转换方法:统一逻辑,明确语义
项目中多次转换时,重复写 try-catch 或校验易出错。封装一个带默认值或 Optional 的工具方法更可控。
立即学习“Java免费学习笔记(深入)”;
- 返回默认值版:
public static int safeParseInt(String s, int defaultValue),内部先 trim + isCreatable 再 parse - 返回 Optional 版:
public static Optional<Integer> tryParseInt(String s),成功返回Optional.of(...),失败返回Optional.empty() - 避免在循环里频繁 try-catch,把防御逻辑收口到这一层
慎用 try-catch:只兜底,不主控
try-catch 不是万能解药。它无法区分“格式错误”和“数值溢出”,且性能成本高于前置校验。
- 仅用于无法完全控制输入源的场景(如解析第三方 CSV、日志行)
- catch 后不要静默吞掉异常,至少记录原始字符串和错误原因
- 绝不把 try-catch 当作“判断是否为数字”的手段——那属于逻辑倒置
- 注意:
"99999999999999999999"对int或long仍会抛异常,NumberUtils 也不解决溢出

















