NutzCN Logo
分享 关于'08','09'这两个字符串无法转换为数字的原因
发布于 2933天前 作者 songofhawk 1496 次浏览 复制 上一个帖子 下一个帖子
标签:

我们的项目里有一个rest接口,参数分别为数字表示的年和月, 比如: http://xxx/xxx?year=2016&month=06, 本来一直用得好好的, 到8月份突然就不行了, 提示错误

org.nutz.castor.FailToCastObjectException: Fail to cast '08' to <java.lang.Integer>

后来发现只有8月和9月不行, 其他月份都可以, 猜测可能是进制判断引起的, 按照源码调试了一下, 果然如此:

    protected Integer valueOf(String str) {
        Nums.Radix ni = Nums.evalRadix(str);
        return Integer.valueOf(ni.val, ni.radix);
    }
    public static Radix evalRadix(String str) {
        if (str.startsWith("0x"))
            return new Radix(str.substring(2), 16);
        if (str.startsWith("0") && str.length() > 1)
            return new Radix(str.substring(1), 8);
        if (str.startsWith("0b"))
            return new Radix(str.substring(2), 2);
        return new Radix(str, 10);
    }

可以看出在转换之前先要判断进制, 而如果字符串以'0'开头,又大于1位,就会被判断为8进制, 这样的话, 00~07都是合法数字, 而且跟10进制的数字值相同, 不会引起错误, 而从'10'开始, 数字不以0开头了, 又会被判断为10进制, 都不会出现问题, 只有'08','09', 被判断为非法的8进制数字。

解决方法为调用接口之前先处理一下,把多余的0去掉了,形如: http://xxx/xxx?year=2016&month=8

0 回复
添加回复
请先登陆
回到顶部