遇到numberformatexception应就地处理:先判空校验,再用try-catch捕获并返回默认值、自定义异常或日志;推荐封装safeparseint等工具方法,结合正则或stringutils预筛,小数场景用bigdecimal替代parseint。

遇到 NumberFormatException,说明你用 Integer.parseInt()、Long.parseLong() 等方法尝试把一个非法格式的字符串转成数字时失败了。这不是异常要“拦截”,而是应该在转换前做校验或用更安全的方式兜底处理。
用 try-catch 主动捕获并处理异常
这是最直接、最常用的做法。不要让异常向上抛,而是在转换处就地处理:
- 把可能出错的转换逻辑包在
try块里 - 在
catch (NumberFormatException e)中返回默认值(如 0、-1)、抛自定义业务异常,或记录日志后跳过 - 避免空指针:先判空再转换,或者用
Objects.toString(str, "")防 null
示例:
String input = "abc";
int value;
try {
value = Integer.parseInt(input.trim());
} catch (NumberFormatException e) {
value = 0; // 或 throw new BusinessException("输入不是有效整数");
}
提前校验字符串是否符合数字格式
对确定要转整数的字符串,可用正则或 Apache Commons Lang 的工具类预筛:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 简单整数:用
str.matches("-?\d+")(注意不能匹配 "+123" 或带空格) - 更健壮:用
StringUtils.isNumeric()(不支持负号)或StringUtils.isNumericSpace()(支持空格但不支持负号) - 推荐组合判断:
StringUtils.isNotBlank(str) && str.matches("-?\d+")
使用封装好的安全转换工具方法
自己写一个复用的方法,内部封装 try-catch,调用方更干净:
- 返回
Optional<integer></integer>:成功返回Optional.of(value),失败返回Optional.empty() - 返回默认值:如
safeParseInt(String s, int defaultValue) - 支持 trim、null 安全、边界检查(比如只接受 0~100 的值)
例如:
public static Optional<integer> safeParseInt(String s) {
if (s == null || s.trim().isEmpty()) return Optional.empty();
try {
return Optional.of(Integer.parseInt(s.trim()));
} catch (NumberFormatException e) {
return Optional.empty();
}
}</integer>
考虑用 BigDecimal 处理不确定精度或含小数的场景
如果原始字符串可能是小数(如 "3.14"、"1e2"),别硬用 parseInt,改用 new BigDecimal(str):
-
BigDecimal构造器也抛NumberFormatException,同样需要 try-catch - 它比
Double.parseDouble()更精确,适合金额、科学数据等场景 - 若只要整数部分,可后续调用
bd.intValueExact()(会检查是否真为整数,否则抛 ArithmeticException)
不复杂但容易忽略:真正的问题往往不在“怎么抓异常”,而在“为什么会有非法字符串进来”——前端没校验、配置文件写错、数据库字段类型不一致。所以除了代码兜底,也要从前端输入、接口契约、日志监控上一起发力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










