Scanner.useRadix()用于指定nextInt()等方法的解析进制,仅对带进制感知的nextXxx()有效,需读取前设置;十六进制不识别"0x"前缀,二进制只接受'0''1';进制设置为实例级,多次读取不同进制需手动切换并重置。

Scanner.useRadix() 可以让 Scanner 在读取整数时自动按指定进制解析输入,无需手动调用 Integer.parseInt(str, radix)。关键在于:它只影响 nextByte()、nextInt()、nextLong() 等带进制感知的 nextXxx() 方法,对 next() 或 nextLine() 无效,且必须在读取前设置。
设置进制后直接读取十六进制数
调用 useRadix(16) 后,nextInt() 会把输入(如 "FF"、"a1"、"0x1F")当作十六进制解析——注意:Scanner 默认不识别 "0x" 前缀,输入需为纯十六进制数字(如 "FF"),否则抛出 InputMismatchException。
- 正确输入示例:
FF→ 解析为 255;dead→ 解析为 57005 - 错误输入示例:
0xFF或0x1A会失败,因为 Scanner 不跳过 "0x" - 使用前务必检查输入合法性,或用 try-catch 捕获异常
读取二进制数据需显式设为 radix=2
二进制同理,调用 useRadix(2) 后,nextInt() 只接受由 '0' 和 '1' 组成的字符串:
- 输入
1010→ 解析为 10 - 输入
1102或0b101会报错(含非法字符或前缀) - 若用户习惯输 "0b...",建议先用
next()读字符串,再手动截掉前缀后 parseInt
进制设置是 Scanner 实例级别的,需按需重置
同一个 Scanner 对象多次读取不同进制数据时,必须每次读取前调用 useRadix() 切换:
- 比如先读一个十六进制数:
scanner.useRadix(16); int hex = scanner.nextInt(); - 再读一个十进制数:
scanner.useRadix(10); int dec = scanner.nextInt(); - 忘记重置会导致后续读取仍按旧进制解析,极易出错
实用小技巧:封装带进制提示的输入方法
为提升用户体验和健壮性,可封装工具方法:
- 打印提示如 "请输入十六进制数(不含 0x):",再调
useRadix(16)+nextInt() - 捕获 InputMismatchException 并提示格式错误,然后
scanner.nextLine()清空错误输入行 - 读完后主动恢复默认进制(radix=10),避免影响后续逻辑

















