一、方法定义
Long.parseLong()
是 java.lang.Long
类的静态方法,用于将字符串解析为 long
基本类型。
1. 基本语法
public static long parseLong(String s) throws NumberFormatException
public static long parseLong(String s, int radix) throws NumberFormatException
参数说明:
s
:要解析的字符串(不能为null
)radix
:进制基数(可选),取值范围 2~36(默认为 10,即十进制)
返回值:解析后的
long
值异常:
NumberFormatException
(字符串格式不合法时抛出)
二、功能说明
将一个表示数字的字符串转换为 long
类型的整数。
- 支持正负号(
+
或-
) - 默认按十进制解析
- 可指定进制(如二进制、八进制、十六进制)
- 能正确处理边界值:
- 最小值:
-9223372036854775808
(Long.MIN_VALUE
) - 最大值:
9223372036854775807
(Long.MAX_VALUE
)
- 最小值:
三、示例代码
1. 基本用法(十进制)
public class ParseLongExample {
public static void main(String[] args) {
// 正常解析
System.out.println(Long.parseLong("123")); // 123
System.out.println(Long.parseLong("-456")); // -456
System.out.println(Long.parseLong("+789")); // 789
// 边界值
System.out.println(Long.parseLong("9223372036854775807")); // Long.MAX_VALUE
System.out.println(Long.parseLong("-9223372036854775808")); // Long.MIN_VALUE
}
}
2. 指定进制解析
// 二进制
System.out.println(Long.parseLong("1111", 2)); // 15
// 八进制
System.out.println(Long.parseLong("17", 8)); // 15
// 十六进制(不区分大小写)
System.out.println(Long.parseLong("FF", 16)); // 255
System.out.println(Long.parseLong("ff", 16)); // 255
System.out.println(Long.parseLong("aBc123", 16)); // 11256163
// 三十六进制(最大支持)
System.out.println(Long.parseLong("zz", 36)); // 1295
3. 带 0x
前缀的十六进制(需手动处理)
String hex = "0xFF";
// ❌ 直接解析会报错
// Long.parseLong(hex, 16); // 抛 NumberFormatException
// ✅ 正确做法:去除前缀
if (hex.startsWith("0x")) {
hex = hex.substring(2);
}
long value = Long.parseLong(hex, 16);
System.out.println(value); // 255
四、使用技巧
技巧 | 说明 |
---|---|
✅ 自动识别正负号 | 支持 + 和 - 开头 |
✅ 灵活进制支持 | 使用 radix 参数可解析任意进制(2~36) |
✅ 结合正则预校验 | 提前判断字符串是否合法,避免异常 |
✅ 封装安全解析方法 | 返回 Optional<Long> 或默认值 |
✅ 与 Long.valueOf() 区别使用 |
valueOf 返回 Long 对象,parseLong 返回 long 原始类型 |
// 安全解析封装
public static Optional<Long> tryParseLong(String s) {
try {
return Optional.of(Long.parseLong(s));
} catch (NumberFormatException e) {
return Optional.empty();
}
}
// 使用
Optional<Long> result = tryParseLong("abc");
if (result.isPresent()) {
System.out.println(result.get());
} else {
System.out.println("解析失败");
}
五、常见错误
错误 | 原因 | 修复方式 |
---|---|---|
❌ NumberFormatException |
字符串包含非数字字符(如空格、字母) | 清理字符串或捕获异常 |
❌ 解析 null |
传入 null 字符串 |
判空处理 |
❌ 超出 long 范围 |
数值超过 Long.MAX_VALUE 或低于 Long.MIN_VALUE |
使用 BigInteger 或提前校验 |
❌ 0x 前缀未处理 |
直接解析 "0xFF" 报错 |
手动去除前缀或使用 Long.decode() |
❌ 进制设置错误 | 如十进制数用二进制解析 | 确保 radix 正确 |
六、注意事项
- 空值处理:传入
null
会抛NullPointerException
- 空字符串:
""
或" "
会抛NumberFormatException
- 前导空格:不自动忽略,需调用
.trim()
- 大小写:十六进制中 a-f 不区分大小写
- 性能:频繁调用时注意异常开销(异常较重)
七、最佳实践
实践 | 推荐做法 |
---|---|
🔹 始终捕获异常 | 解析外部输入时必须 try-catch |
🔹 预处理字符串 | 使用 .trim() 去除空格 |
🔹 使用 Long.decode() 解析带前缀的十六进制 |
支持 0x , # , -0x 等 |
🔹 边界校验 | 对关键数值做范围检查 |
🔹 封装工具类 | 提供默认值版本,如 parseLongOrDefault(s, defaultVal) |
// 工具类示例
public class NumberUtils {
public static long parseLongOrDefault(String s, long defaultValue) {
if (s == null || s.trim().isEmpty()) {
return defaultValue;
}
try {
return Long.parseLong(s.trim());
} catch (NumberFormatException e) {
return defaultValue;
}
}
}
八、性能优化建议
场景 | 优化策略 |
---|---|
⚡ 高频解析 | 避免异常控制流程,先用正则校验格式 |
⚡ 大量数据 | 考虑使用 Scanner 或流式解析 |
⚡ 缓存常用值 | 如配置中的固定数值可缓存 |
// 预校验避免异常开销
public static boolean isNumeric(String str) {
return str != null && str.matches("-?\\d+");
}
if (isNumeric(input)) {
value = Long.parseLong(input);
} else {
// 处理错误
}
⚠️ 注意:正则校验也有开销,需权衡使用。
九、与相关方法对比
方法 | 区别 |
---|---|
Long.valueOf(String) |
返回 Long 对象,内部调用 parseLong ,支持缓存小数值 |
Long.decode(String) |
支持 0x , 0 , # 等前缀的十六进制、八进制解析 |
Integer.parseInt() |
用于 int 类型,范围更小 |
Double.parseDouble() |
用于浮点数 |
✅ 推荐:
- 普通十进制:用
Long.parseLong(s)
- 带
0x
的十六进制:用Long.decode(s)
- 需要对象:用
Long.valueOf(s)
十、总结
项目 | 内容 |
---|---|
✅ 核心功能 | 将字符串解析为 long 类型 |
✅ 关键特性 | 支持正负号、多进制、边界值 |
✅ 典型用途 | 配置读取、用户输入解析、数据转换 |
✅ 使用要点 | 注意异常、空值、前缀、进制 |
✅ 最佳实践 | 封装安全方法、预处理、合理捕获异常 |
✅ 避坑指南 | null 、空字符串、0x 前缀、超出范围 |
💡 一句话掌握:
Long.parseLong()
是将字符串转为 long
的核心方法,强大但需谨慎处理异常和格式,配合 trim()
、异常处理和工具封装,可安全高效使用。
🎯 推荐用法模板:
try {
long value = Long.parseLong(input.trim());
} catch (NumberFormatException e) {
// 处理解析失败
}