Integer.decode支持带前缀的十进制(无前缀或±)、十六进制(0x/0X/#)和八进制(单个前导0),但不支持二进制及多前导零八进制,内部调用parseInt自动推断进制。

Integer.decode 可以解析带进制前缀的十进制、十六进制、八进制字符串,但不支持二进制,也不接受无前缀的八进制(如 "012" 会被当作十进制处理)。
支持的格式和前缀
它识别以下三种带前缀的字符串:
-
十进制:无前缀或以
+/-开头,例如"123"、"-456" -
十六进制:以
"0x"、"0X"或"#"开头,例如"0xFF"、"#abc"、"0X1A" -
八进制:以
"0"开头(注意:仅限单个前导零),例如"017"(即十进制 15)
⚠️ 注意:"012" 是合法八进制字面量,会被解析为十进制 10;但 "0012"(多个前导零)会抛出 NumberFormatException,因为 decode 内部调用 Integer.parseInt(s, radix) 时,对八进制只允许一个 0 前缀。
实际使用示例
代码片段:
立即学习“Java免费学习笔记(深入)”;
System.out.println(Integer.decode("100")); // 100(十进制)
System.out.println(Integer.decode("0xFF")); // 255(十六进制)
System.out.println(Integer.decode("#1a")); // 26(十六进制,忽略大小写)
System.out.println(Integer.decode("017")); // 15(八进制)
System.out.println(Integer.decode("-0x10")); // -16(支持负号,前缀后紧跟)
非法示例:
-
"0xG1"→ 字符 G 不在十六进制范围内,抛异常 -
"089"→ 八进制中不允许出现 8 或 9,抛异常 -
"007"→ 多余前导零,不被 decode 认为是合法八进制格式 -
"1010"(想按二进制解析)→ 不支持,无对应前缀
与 parseInt 的区别
Integer.decode 是语法糖,内部会根据前缀自动选基数(radix),再调用 parseInt。而 Integer.parseInt(s, radix) 要求你显式指定进制:
-
Integer.parseInt("FF", 16)→ 255 -
Integer.parseInt("17", 8)→ 15 -
Integer.parseInt("017", 8)→ 合法(因为明确指定了 radix=8,前导零不影响)
所以如果你已知进制,用 parseInt 更直接、更可控;如果输入字符串格式不固定(可能带各种前缀),decode 更方便。
常见陷阱提醒
容易出错的地方:
- 八进制解析只认单个
0前缀,"0012"会失败,但parseInt("0012", 8)没问题 -
"#"前缀仅用于十六进制,不能用于八进制或十进制 - 空格或不可见字符(如全角空格)会导致解析失败,建议先
trim() - 结果超出
int范围(如"0xFFFFFFFF")会抛NumberFormatException(不是溢出为负数)


















