Java八进制字面量以0开头但仅限0–7,含8或9即报错;十六进制前缀0x/0X不区分大小写,字母a–f也不区分;parseInt不接受任何前缀,需手动去除;toHexString等方法输出无前缀,需自行拼接。

Java里写八进制字面量,为什么加0就报错?
Java中八进制字面量必须以 0 开头,但仅限数字 0–7;一旦出现 8 或 9,编译器立刻报错 Invalid octal digit。
常见错误现象:写 int x = 08; 或 int y = 019; —— 看似像八进制,实则非法,因为 8 和 9 不属于八进制数码。
- 八进制只接受
0–7,0开头是强制约定,不是可选前缀 - Java 7+ 支持下划线分隔符,如
0123_456合法,但012_8仍非法 - 注意:
0单独写是合法的八进制(值为 0),也是十进制、十六进制的 0,无歧义
十六进制字面量写 0x 还是 0X?大小写敏感吗?
0x 和 0X 都合法,Java 不区分大小写;但字母部分(a–f)在字面量中不区分大小写,0xFF、0xff、0xFf 全部等价。
使用场景:常用于位掩码、颜色值、协议字段等需直观表达二进制分组的场合。
立即学习“Java免费学习笔记(深入)”;
-
0x是唯一被接受的十六进制前缀,0h、$、h等写法全部编译失败 - 十六进制字母推荐小写(
0xaabbcc),与主流工具链(JVM 字节码、IDEA 反编译、jstack 输出)风格一致 - 注意:
0x后必须至少跟一个有效十六进制字符,0x单独写会报错Hexadecimal number not terminated
Integer.parseInt("1010", 2) 转二进制时,字符串能带前缀吗?
不能。所有基于 parseInt(String, radix) 的进制转换,输入字符串必须是纯数字字符,不允许含 0b、0x、0 等前缀,否则抛 NumberFormatException。
常见错误现象:Integer.parseInt("0b1010", 2) 直接崩溃;而 Integer.parseInt("1010", 2) 正确返回 10。
- 前缀只对编译期字面量有效,运行时字符串解析完全无视它们
- 若你拿到的是带
0x的字符串(比如日志或配置),得先用String.replaceFirst("0x|0X", "")去前缀再解析 - 注意
radix范围是 2–36;传1或37会抛IllegalArgumentException
用 Integer.toHexString() 输出时,为什么没有 0x 前缀?
Java 标准库所有 toHexString、toOctalString、toBinaryString 方法,输出都是纯数字字符串,不含任何进制前缀——这是设计使然,不是 bug。
性能影响:这些方法内部不拼接前缀,避免字符串拷贝开销,适合高频调用场景(如日志、序列化)。
- 需要前缀就得自己加:
"0x" + Integer.toHexString(255)→"0xff" -
toOctalString返回的字符串也不带开头的0,例如Integer.toOctalString(8)返回"10",不是"010" - 如果要补零对齐(如 8 位十六进制),别用
String.format("%08x", n),它比手动逻辑稍慢;高频场景建议用Objects.toString(n, "00000000")配合位运算预计算
真正容易被忽略的是:字面量前缀和运行时解析是两套系统,前者由编译器处理,后者全靠字符串规则。混用前缀和 parseInt 是新人最常卡住的地方。










