1. 程式人生 > >java.lang.IndexOutOfBondsException:setSpan(3..3) ends beyond length 2

java.lang.IndexOutOfBondsException:setSpan(3..3) ends beyond length 2

在友盟的錯誤統計,看到這個錯誤。

這裡寫圖片描述

然後,找到專案中的程式碼。程式碼如下:

 TextWatcher withdrawalWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String cash = s.toString();
            int length = cash.length();
            String zero = Constants.VAR_ZERO;
            String dot
= Constants.HIDDEN_PREFIX; if (cash.startsWith(dot)) { cash = zero + cash; edtWithdrawal.setText(cash); edtWithdrawal.setSelection(cash.length()); } else if (cash.contains(dot)) { if ((length - 1) - cash.indexOf(dot
) > 2) { cash = cash.substring(0, cash.indexOf(dot) + 3); edtWithdrawal.setText(cash); edtWithdrawal.setSelection(cash.length()); } } else if (cash.startsWith(zero) && length > 1 && !cash.substring(1
, 2).equals(dot)) { String subCash = cash.substring(1, length); edtWithdrawal.setText(subCash); edtWithdrawal.setSelection(subCash.length()); } else if (length > 1 && (Double.parseDouble(cash) > mCashTotal)) { String more = cash.substring(0, length - 1); edtWithdrawal.setText(more); edtWithdrawal.setSelection(more.length()); }

報錯:是問題出現在這裡。

else if (length > 1 && (Double.parseDouble(cash) > mCashTotal)) {
                String more = cash.substring(0, length - 1);
                edtWithdrawal.setText(more);
                edtWithdrawal.setSelection(more.length());
            }

簡要的說下,這個程式碼的作用,就是判斷使用者輸入的數字(##.##型別),是否大於給定的數字,如果大於,就刪除最後一次輸入的資料。結果,就出現這樣的問題。

後來,測試發現,如果 mCashTotal = 80 edittext 輸入資料是33.00,這樣不報錯。如果點選輸入框,在33中間輸入一個3,立刻就會報這個錯誤。

可見,這樣的判斷有問題。後來,想到另外一種解決辦法。就是如果超出,就保留上次的輸入值就可以了。程式碼如下:

這裡寫圖片描述

如果超過最大值,記錄上次的輸入值,然後賦值給edittext,游標移到上次的位置,解決問題。