一、方法定义

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 类型的整数。

  • 支持正负号(+-
  • 默认按十进制解析
  • 可指定进制(如二进制、八进制、十六进制)
  • 能正确处理边界值:
    • 最小值:-9223372036854775808Long.MIN_VALUE
    • 最大值:9223372036854775807Long.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 正确

六、注意事项

  1. 空值处理:传入 null 会抛 NullPointerException
  2. 空字符串""" " 会抛 NumberFormatException
  3. 前导空格:不自动忽略,需调用 .trim()
  4. 大小写:十六进制中 a-f 不区分大小写
  5. 性能:频繁调用时注意异常开销(异常较重)

七、最佳实践

实践 推荐做法
🔹 始终捕获异常 解析外部输入时必须 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) {
    // 处理解析失败
}