Long.decode(String nm)
是 java.lang.Long
类中的一个静态方法,用于将包含十进制、十六进制或八进制数字的字符串解析为 Long
对象。它比 Long.parseLong()
更灵活,因为它能自动识别数字的进制前缀。
📚 一、方法定义
public static Long decode(String nm) throws NumberFormatException
参数:
nm
:表示数字的字符串。支持以下格式:- 十进制:
123
、-456
- 十六进制:
0x123
、0X123
、#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()
。
⚠️ 五、注意事项
不支持二进制:
Long.decode("0b1010")
会抛出NumberFormatException
- 正确方式:
Long.parseLong("1010", 2)
空字符串或 null:
decode(null)
抛出NullPointerException
decode("")
抛出NumberFormatException
前导空格:
- 不支持空格,
" 0xFF"
会失败 - 可先调用
.trim()
- 不支持空格,
性能:
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 )、不支持空格、不支持小数 |
异常处理 | 必须处理 NumberFormatException 和 NullPointerException |
性能 | 略慢于 parseLong() ,但功能更强大 |
推荐使用 | ✅ 当输入格式不确定且可能带 0x /# 时首选 |
✅ 一句话掌握:
用
Long.decode()
解析带0x
、#
或0
前缀的整数字符串,自动识别进制,返回Long
对象,适用于颜色值、配置解析等场景。