integer.parseint 遇非数字字符串抛 numberformatexception 是设计使然,安全使用需先校验再转换:判空、trim、正则匹配(如 "-?d+"),或封装为返回默认值/optional 的工具方法。

遇到非数字字符串时,Integer.parseInt 会直接抛出 NumberFormatException,这不是 bug,而是设计使然——它只负责严格解析,不处理容错。要安全使用,关键在于“先校验,再转换”,而不是依赖 try-catch 做主逻辑。
用正则预判是否为合法整数字符串
提前过滤掉明显非法格式,比如空字符串、纯空格、带字母或多余符号的字符串。对常见需求(如表单输入、配置值),可先用正则快速判断:
-
str != null && str.trim().matches("-?\d+")—— 支持带符号的十进制整数(不含前导零,除非是"0"本身) - 若需允许前导零(如"007"),可用
str.trim().matches("-?0*\d+"),但注意这会把"00"、"-00"也视为合法 - 校验通过后再调用
parseInt,基本可避免异常
封装一个安全的 parseInt 工具方法
把 try-catch 封装成可复用逻辑,返回默认值或 Optional,让调用方更清晰地表达意图:
- 返回默认值(如 0 或 -1):
public static int parseIntOrDefault(String s, int defaultValue) {<br> try { return Integer.parseInt(s.trim()); }<br> catch (NumberFormatException | NullPointerException e) { return defaultValue; }<br>} - 返回 Optional
(推荐用于新项目): public static Optional<integer> parseIntSafe(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>
区分场景,选择合适策略
不同上下文对错误的容忍度和处理方式不同:
- 用户输入(如 Web 表单):应前端校验 + 后端再次校验,错误时返回友好提示(如“请输入有效整数”),而非吞掉异常
- 读取配置文件或日志字段:建议用 Optional 方式,缺失或非法时走默认分支,避免程序中断
-
内部数据流转(已知格式):可直接用
parseInt,配合单元测试覆盖边界情况,异常代表数据源有问题,需要报警而非静默处理
注意 trim() 和空值检查不能省略
parseInt(" 123 ") 会失败,parseInt(null) 或 parseInt("") 都抛 NPE 或 NumberFormatException。务必在解析前做:
- 判空(
s == null) - 去空格并判空(
s.trim().isEmpty()) - 再进行正则校验或 try-catch
不复杂但容易忽略。核心就两条:别让非法字符串走到 parseInt 里;真要兜底,就把异常处理收拢到工具层,别散落在业务代码里反复写 try-catch。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











