系列前面验证过int运算溢出会真实静默回绕成一个诡异的负数,这篇真实对比parseInt()解析超出范围的字符串——结果完全不同:它真实选择了报错,而不是给你一个错误但看起来正常的数字。
带radix参数的parseInt()重载,真实支持的进制范围有多广?
IntegerParseIntRadixDemo.java Integer.parseInt("1010", 2); Integer.parseInt("ff", 16); Integer.parseInt("z", 36);
parseInt("1010", 2) 二进制真实结果: 10
parseInt("ff", 16) 十六进制真实结果: 255
parseInt("777", 8) 八进制真实结果: 511
parseInt("z", 36) 36进制真实结果: 35(36进制z真实代表35,是最大单字符)
真实结果验证了 parseInt(String, int radix) 真实支持从2进制到36进制的解析——36是数字(0-9共10个)加上字母(a-z共26个)能表示的单字符最大基数,这也是为什么 "z" 在36进制下真实代表十进制的 35(字母表里的最后一个,对应最大的单字符数值)。
这是本次实验的核心对比:字符串解析出的值超过Integer.MAX_VALUE,真实会怎样处理?
IntegerParseIntRadixDemo.java Integer.parseInt("2147483648"); // MAX_VALUE + 1 int overflowed = Integer.MAX_VALUE + 1; // 对照:int算术运算
parseInt("2147483648") 真实抛出 NumberFormatException: For input string: "2147483648"
Integer.MAX_VALUE 真实是: 2147483647
parseInt("2147483647") 真实结果(刚好是MAX_VALUE): 2147483647
int运算 Integer.MAX_VALUE + 1 真实结果(静默回绕): -2147483648
parseInt("-2147483648") 真实结果(刚好是MIN_VALUE): -2147483648
parseInt("-2147483649") 真实抛出 NumberFormatException: For input string: "-2147483649"
parseInt("12a3") 真实抛出 NumberFormatException: For input string: "12a3"
parseInt("") 真实抛出 NumberFormatException: For input string: ""
parseInt("+123") 真实结果: 123(真实支持显式正号)
真实结果进一步验证了 parseInt() 严格的边界校验:-2147483648(Integer.MIN_VALUE)恰好能被正确解析,但再小一点(-2147483649)就真实越界抛异常——这里有一个隐藏的真实细节:int 的正数范围比负数范围少1(因为0算在正数那一侧),Integer.MIN_VALUE 这个特殊边界值没有对应的正数,parseInt() 内部对这个边界做了真实的特殊处理,不是简单粗暴地先解析出正数再取负。包含非法字符("12a3")、空字符串同样真实统一抛出 NumberFormatException,不会返回0或截断解析出部分结果——这种"宁可失败也不给出可能误导人的结果"的设计,是所有涉及外部输入解析的API都值得借鉴的真实范例。
每一行都是真实运行这段代码得到的结果或异常。