scanner类无radix()方法,仅提供useradix(int)设置进制,默认十进制且不可直接获取;推荐封装类自行维护currentradix并提供getradix()。
java.util.scanner 类中没有 radix() 方法,也不提供直接查看当前进制(radix)的公开方法。
你可能混淆了以下两个概念:
-
Scanner.useRadix(int radix):用于设置 Scanner 解析整数时使用的进制(如scanner.useRadix(16)表示按十六进制解析); -
Scanner.radix():该方法并不存在 ——Scanner类中没有名为radix()的 public 或 protected 方法,JDK 文档和源码均可证实。
✅ 正确理解 Scanner 的进制行为
Scanner 内部维护一个当前整数解析进制(radix),默认是 10(十进制)。它可通过 useRadix(int) 修改,但 Java 不提供获取该值的 API。
? 验证方式:查看 Oracle 官方 Scanner 文档,搜索
radix,只会看到useRadix(int),无radix()或getRadix()。
❓那怎么“知道”当前用的是什么进制?
由于没有 radix() 方法,无法直接读取。但你可以:
-
自己记录:每次调用
useRadix(r)时,手动保存r到变量中; -
重置并测试(不推荐,有副作用):
虽然不能读,但可临时切换 radix 并观察解析结果差异(仅用于调试,非可靠方案)。
✅ 推荐做法:封装 + 显式管理
public class RadixAwareScanner {
private final Scanner scanner;
private int currentRadix = 10; // 默认十进制
public RadixAwareScanner(InputStream source) {
this.scanner = new Scanner(source);
}
public void useRadix(int radix) {
if (radix Character.MAX_RADIX) {
throw new IllegalArgumentException("radix out of range: " + radix);
}
this.scanner.useRadix(radix);
this.currentRadix = radix;
}
public int getRadix() {
return currentRadix; // ✅ 自己维护,可安全获取
}
public Scanner delegate() {
return scanner;
}
}
使用示例:
RadixAwareScanner rs = new RadixAwareScanner(System.in); System.out.println(rs.getRadix()); // 输出 10 rs.useRadix(16); System.out.println(rs.getRadix()); // 输出 16 int x = rs.delegate().nextInt(); // 按十六进制解析输入(如输入 "1F" → 31)
⚠️ 注意事项
-
useRadix()只影响后续的nextInt()、nextShort()、nextLong()等整数解析方法,不影响next()、nextLine()或浮点数方法(如nextDouble()); -
nextBigInteger()和nextBigDecimal()也受useRadix()影响; - 进制范围必须在
Character.MIN_RADIX(2)到Character.MAX_RADIX(36)之间; -
useRadix(0)是非法的,会抛IllegalArgumentException。
不复杂但容易忽略:Scanner 的 radix 是内部状态,Java 选择不暴露读取接口,属于设计上的“写多读少”考量。需要时,自己封装一层最稳妥。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











