Java中的NumberFormatException是运行时异常的一种,当程序尝试将不符合数值格式的字符串转换为对应的数值类型时,就会抛出这个异常。比如把包含字母的字符串转成整数,或者把格式错误的字符串转成浮点数,都会触发该异常。

NumberFormatException的常见触发场景
最常见的触发场景就是字符串转数值的操作,以下是几个典型的情况:
- 字符串中包含非数值字符,比如将"123a"转换为整数
- 字符串为空或者为null,尝试转换时触发异常
- 字符串表示的数值超出了对应类型的范围,比如将"9999999999"转换为byte类型
- 字符串格式不符合数值规范,比如浮点数转换时使用了错误的分隔符
使用try catch捕获处理异常
最直接的处理方式就是使用try catch语句块捕获NumberFormatException,在catch块中处理异常逻辑,避免程序直接崩溃。
以下是一个将字符串转换为整数的处理示例:
public class NumberFormatExceptionDemo {
public static void main(String[] args) {
String str = "123a";
try {
int num = Integer.parseInt(str);
System.out.println("转换后的数值为:" + num);
} catch (NumberFormatException e) {
// 捕获异常后打印提示信息,也可以记录日志或者执行其他兜底逻辑
System.out.println("字符串格式错误,无法转换为整数");
System.out.println("异常信息:" + e.getMessage());
}
}
}
前置校验避免异常发生
除了捕获异常,我们还可以在转换之前先对字符串进行校验,判断其是否符合数值格式,从根源上避免异常触发。
可以通过正则表达式校验字符串是否为合法的整数格式:
public class ValidateDemo {
public static boolean isInteger(String str) {
// 正则匹配整数格式,支持正负号
String integerRegex = "^[-+]?\d+$";
return str != null && str.matches(integerRegex);
}
public static void main(String[] args) {
String str1 = "123";
String str2 = "123a";
System.out.println(str1 + "是否为整数:" + isInteger(str1));
System.out.println(str2 + "是否为整数:" + isInteger(str2));
if (isInteger(str1)) {
int num = Integer.parseInt(str1);
System.out.println("转换结果:" + num);
} else {
System.out.println("字符串不符合整数格式,无法转换");
}
}
}
不同数值类型的转换注意事项
不同的数值类型转换时,对应的处理也有细微差别,以下是常见类型的转换说明:
| 转换方法 | 适用类型 | 注意事项 |
|---|---|---|
| Integer.parseInt() | 整数 | 字符串只能包含数字和正负号,超出int范围会抛异常 |
| Long.parseLong() | 长整数 | 字符串格式要求和整数一致,范围比int更大 |
| Double.parseDouble() | 浮点数 | 支持科学计数法,小数点用.分隔,不能包含其他特殊字符 |
| Boolean.parseBoolean() | 布尔值 | 只有"true"(忽略大小写)会返回true,其他字符串都返回false,不会抛异常 |
最佳实践建议
在实际开发中,处理NumberFormatException可以遵循以下原则:
- 如果转换的字符串来源不可控,优先使用try catch捕获异常,避免程序崩溃
- 如果字符串是可控的,比如来自固定的配置项,可以先做前置校验再转换
- 捕获异常后不要直接吞掉异常,至少要记录异常信息,方便后续排查问题
- 转换数值时注意对应类型的范围,避免数值溢出导致的异常
通过合理的异常处理和前置校验,可以有效减少NumberFormatException对程序的影响,提升代码的稳定性和可维护性。
JavaNumberFormatException异常处理try_catch修改时间:2026-07-21 07:18:19