NumberFormatException常因字符串格式错误引发,如空值、非数字字符、符号错误等。通过try-catch捕获异常,结合trim()和正则预校验,或使用NumberUtils工具类,可有效避免程序中断。建议封装返回Optional或默认值的转换工具,提升代码健壮性与复用性。

在Java中,将字符串转换为数字时,如果字符串格式不合法,会抛出 NumberFormatException。这是 IllegalArgumentException 的子类,通常出现在使用 Integer.parseInt()、Double.parseDouble() 等方法时。为了避免程序因异常而中断,合理处理这种异常至关重要。
理解 NumberFormatException 的常见触发场景
该异常主要发生在以下情况:
- 字符串为空或为 null
- 字符串包含非数字字符(如 "123abc")
- 小数点使用错误或多余(如 "3..14")
- 正负号位置不正确(如 "123-" 或 "--123")
- 超出目标类型的取值范围(如将 "999999999999999999999" 转为 int)
使用 try-catch 进行安全转换
最常用的处理方式是使用 try-catch 包裹转换逻辑:
public static int stringToInt(String str) {
if (str == null || str.trim().isEmpty()) {
return 0; // 或抛出自定义异常
}
try {
return Integer.parseInt(str.trim());
} catch (NumberFormatException e) {
System.err.println("无法转换字符串: " + str);
return 0; // 返回默认值或根据业务决定
}
}
这种方式能有效防止程序崩溃,并可根据需要返回默认值、抛出更友好的异常或记录日志。
立即学习“Java免费学习笔记(深入)”;
预检查字符串格式提升健壮性
在转换前对字符串做合法性校验,可以减少异常抛出频率,提高性能:
- 使用正则表达式判断是否为纯数字(整数):
str.matches("\\d+") - 支持负数和小数的正则示例:
str.matches("-?\\d+(\\.\\d+)?") - 结合 Apache Commons Lang 库的 StringUtils.isNumeric() 或 NumberUtils.isParsable()
例如:
if (NumberUtils.isParsable(str)) {
double value = Double.parseDouble(str);
} else {
// 处理非法输入
}
这样可以在不触发异常的情况下完成类型判断。
封装通用转换工具类
为避免重复代码,建议封装一个工具类:
public class NumberUtil {
public static Optional toInt(String str) {
if (str == null) return Optional.empty();
try {
return Optional.of(Integer.parseInt(str.trim()));
} catch (NumberFormatException e) {
return Optional.empty();
}
}
public static int toIntOrDefault(String str, int defaultValue) {
return toInt(str).orElse(defaultValue);
}
}
使用 Optional 可以更优雅地处理可能失败的转换,调用方能清晰判断结果是否存在。
基本上就这些。掌握异常捕获、前置校验和工具封装,就能在实际开发中稳妥处理字符串转数字的问题。关键是根据业务需求选择返回默认值、抛出异常还是静默处理。










