Long.decode(String nm)java.lang.Long 类中的一个静态方法,用于将包含十进制、十六进制或八进制数字的字符串解析为 Long 对象。它比 Long.parseLong() 更灵活,因为它能自动识别数字的进制前缀。


📚 一、方法定义

public static Long decode(String nm) throws NumberFormatException
  • 参数

    • nm:表示数字的字符串。支持以下格式:
      • 十进制123-456
      • 十六进制0x1230X123#123
      • 八进制0123(以 0 开头)
  • 返回值

    • 返回一个 Long 对象,表示解析出的 long 值。
  • 异常

    • NumberFormatException:如果字符串格式不合法或超出 long 范围。

✅ 二、支持的格式详解

格式 示例 说明
十进制 "123", "-456" 普通整数
十六进制(小写) "0x1A", "0xff" 0x 开头
十六进制(大写) "0X1A", "0XFF" 0X 开头
十六进制(井号) "#1A", "#FF" # 开头(常见于颜色值)
八进制 "012", "077" 0 开头(注意:Java 8+ 中仍支持)

⚠️ 注意:decode() 不支持二进制格式(如 0b1010),二进制需使用 Long.parseLong("1010", 2)


💡 三、示例代码

示例 1:基本使用

public class LongDecodeExample {
    public static void main(String[] args) {
        // 十进制
        System.out.println(Long.decode("123"));        // 123

        // 十六进制(0x 前缀)
        System.out.println(Long.decode("0x1F"));       // 31
        System.out.println(Long.decode("0XFF"));       // 255

        // 十六进制(# 前缀)
        System.out.println(Long.decode("#FF"));        // 255

        // 八进制(以 0 开头)
        System.out.println(Long.decode("012"));        // 10(八进制 12 = 十进制 10)

        // 负数
        System.out.println(Long.decode("-0x10"));      // -16
    }
}

示例 2:错误处理

public class DecodeErrorHandling {
    public static void main(String[] args) {
        String[] inputs = {
            "abc",      // 非数字
            "12.3",     // 小数(不支持)
            "",         // 空字符串
            null,       // null 值
            "0b1010"    // 二进制(不支持)
        };

        for (String input : inputs) {
            try {
                Long result = Long.decode(input);
                System.out.println(input + " -> " + result);
            } catch (NumberFormatException | NullPointerException e) {
                System.err.println("解析失败: " + input + " -> " + e.getClass().getSimpleName());
            }
        }
    }
}

输出

解析失败: abc -> NumberFormatException
解析失败: 12.3 -> NumberFormatException
解析失败:  -> NumberFormatException
解析失败: null -> NullPointerException
解析失败: 0b1010 -> NumberFormatException

🛠️ 四、使用技巧

1. 解析颜色值(如 HTML 颜色码)

String colorHex = "#FF5733";
Long colorValue = Long.decode(colorHex);
System.out.println("颜色值: " + colorValue); // 16764723

2. 自动识别进制(无需手动判断)

String input = "0xFF"; // 用户输入可能是 0xFF, #FF, 123, 017 等
Long value = Long.decode(input); // 自动识别进制

3. 与 Long.valueOf()parseLong() 对比

方法 是否自动识别前缀 是否返回 Long 是否支持 # 前缀
Long.decode(s) ✅ 是 ✅ 是 ✅ 是
Long.parseLong(s) ❌ 否(需指定进制) ❌ 返回 long ❌ 否
Long.valueOf(s) ❌ 否(需指定进制) ✅ 是 ❌ 否

✅ 推荐:当你不确定输入是哪种进制,且包含 0x# 前缀时,优先使用 decode()


⚠️ 五、注意事项

  1. 不支持二进制

    • Long.decode("0b1010") 会抛出 NumberFormatException
    • 正确方式:Long.parseLong("1010", 2)
  2. 空字符串或 null

    • decode(null) 抛出 NullPointerException
    • decode("") 抛出 NumberFormatException
  3. 前导空格

    • 不支持空格," 0xFF" 会失败
    • 可先调用 .trim()
  4. 性能

    • decode() 内部需要解析前缀,性能略低于 parseLong(),但在大多数场景下差异可忽略。

❌ 六、常见错误

错误 修复方式
NumberFormatException for "0b1010" 改用 Long.parseLong("1010", 2)
NullPointerException for null 增加判空逻辑
无法解析带空格的字符串 使用 str.trim() 预处理
误认为支持二进制 明确使用 parseLong(s, 2)

🏆 七、最佳实践

场景 推荐方法
已知进制(如二进制) Long.parseLong(s, 2)
已知十进制字符串 Long.parseLong(s)Long.valueOf(s)
包含 0x, #, 0 前缀的混合输入 Long.decode(s)
需要缓存小数值(-128~127) Long.valueOf(s)(返回缓存对象)
解析用户输入的数字(可能带前缀) Long.decode(s.trim())

📝 八、总结

项目 内容
核心功能 自动识别 0x, #, 0 前缀,解析为 Long
适用场景 解析带进制前缀的字符串(如颜色码、配置值)
优势 自动识别进制,支持 # 前缀,返回 Long 对象
限制 不支持二进制(0b)、不支持空格、不支持小数
异常处理 必须处理 NumberFormatExceptionNullPointerException
性能 略慢于 parseLong(),但功能更强大
推荐使用 ✅ 当输入格式不确定且可能带 0x/# 时首选

一句话掌握

Long.decode() 解析带 0x#0 前缀的整数字符串,自动识别进制,返回 Long 对象,适用于颜色值、配置解析等场景。