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)抛出NullPointerExceptiondecode("")抛出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对象,适用于颜色值、配置解析等场景。