從源碼的角度分析BigDecimal 初始化報錯

報錯信息

項目Gosn 解析報錯,報錯信息如下。

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

仔細找了下發(fā)現(xiàn)是 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的構造函數(shù)如下(String 類型的入參數(shù))。

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

當我們傳入 String 類型的參數(shù)后,會被轉換為char數(shù)組,然后調用我們最上面貼的構造函數(shù)去構建 BigDecimal。當入參字符串為空字符串的時候就會出現(xiàn)last=-1 ,符合拋出異常的邏輯,就會拋出異常。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容