java.lang.IndexOutOfBondsException:setSpan(3..3) ends beyond length 2
阿新 • • 發佈:2019-01-31
在友盟的錯誤統計,看到這個錯誤。
然後,找到專案中的程式碼。程式碼如下:
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,游標移到上次的位置,解決問題。