从源码的角度分析BigDecimal 初始化报错

报错信息

项目Gosn 解析报错,报错信息如下。

java.lang.NumberFormatException: Bad offset/length: offset=0 len=0 in.length=0

仔细找了下发现是 BigDecimal 报出的错误,下面BigDecimal是初始化的代码时抛出错误的代码(部分代码)。


 public BigDecimal(char[] in, int offset, int len) {
        int begin = offset; // first index to be copied
        int last = offset + (len - 1); // last index to be copied
        String scaleString; // buffer for scale
        StringBuilder unscaledBuffer; // buffer for unscaled value
        long newScale; // the new scale

        if (in == null) {
            throw new NullPointerException("in == null");
        }
        if ((last >= in.length) || (offset < 0) || (len <= 0) || (last < 0)) {
            throw new NumberFormatException("Bad offset/length: offset=" + offset +
                    " len=" + len + " in.length=" + in.length)
        }
    }

什么情况下会报错?

当符合以下代码逻辑时就会抛出错误

 if ((last >= in.length) || (offset < 0) || (len <= 0) || (last < 0)) {
            throw new NumberFormatException("Bad offset/length: offset=" + offset +
                    " len=" + len + " in.length=" + in.length);
        }

什么样的字符串会抛出错误?

我的项目中使用的是使用String 类型的值初始化
BigDecimalBigDecimal的构造函数如下(String 类型的入参数)。

 public BigDecimal(String val) {
        this(val.toCharArray(), 0, val.length());
    }

当我们传入 String 类型的参数后,会被转换为char数组,然后调用我们最上面贴的构造函数去构建 BigDecimal。当入参字符串为空字符串的时候就会出现last=-1 ,符合抛出异常的逻辑,就会抛出异常。

你可能感兴趣的:(从源码的角度分析BigDecimal 初始化报错)