Character.forDigit()仅支持0–radix−1的digit和2–36的radix,非法参数返回'\u0000';安全调用需先校验参数再检测返回值,常用场景可封装为无异常工具方法。

在 Java 中,Character.forDigit() 可以将数字(0–9)或十六进制数字(0–15)安全地转为对应字符(如 '0'–'9'、'a'–'f' 或 'A'–'F'),但**它不适用于任意整数,仅限有效数字值和指定进制范围**。用错参数会导致返回 '\u0000'(空字符),这是常见隐患。
理解 forDigit() 的参数约束
Character.forDigit(int digit, int radix) 要求:
-
digit 必须在
0到radix − 1之间(含端点); -
radix 必须在
2到36之间(Java 支持最多 36 进制:0–9 + a–z); - 若参数非法,方法直接返回
'\u0000',不会抛异常,容易埋下静默错误。
安全调用的推荐写法
避免空字符陷阱,应显式校验再调用:
public static char safeForDigit(int digit, int radix) {
if (digit < 0 || digit >= radix || radix < 2 || radix > 36) {
throw new IllegalArgumentException(
String.format("Invalid digit=%d or radix=%d", digit, radix)
);
}
char c = Character.forDigit(digit, radix);
if (c == '\u0000') {
throw new IllegalStateException("Character.forDigit returned null char unexpectedly");
}
return c;
}
这样既拦截非法输入,又兜底检测异常返回,确保结果可信。
立即学习“Java免费学习笔记(深入)”;
常用场景的简化封装
针对最常用需求,可提供无异常版本的工具方法:
- 转 0–9 →
'0'–'9':digit >= 0 && digit (比 <code>forDigit更快更直); - 转十六进制小写字符:
safeForDigit(digit & 0xF, 16),配合位与防越界; - 批量转换(如生成 hex 字符串):优先用
String.format("%x", n)或Integer.toHexString(),更健壮。
为什么不用 forDigit 处理负数或 ASCII 偏移?
forDigit 专为“数值在某进制下的单个数位”设计,不是通用 int→char 映射工具。例如:
-
Character.forDigit(-1, 10)→'\u0000'(非法); -
Character.forDigit(65, 10)→'\u0000'(65 超出十进制范围); - 想把
65变成'A'?该用(char)65或Character.toChars(65)[0],而非forDigit。
混淆用途是多数误用的根源。


















