我正在尝试分割字符串并将其与常量字符串匹配。我得到了要检查发件人的地址字符串,以尝试拆分字符串。为此,我尝试了这种方式。
if (cursor != null) {
cursor.moveToFirst();
try {
while (!cursor.isAfterLast() && !cursor.isBeforeFirst()) {
String messageAddress = cursor.getString(cursor.getColumnIndexOrThrow("address"));
if (isCorporateMessage(messageAddress)) {
String matchString[] = messageAddress.split("-");
if (matchString[0].length() == 2) { //getting exception here I guess
if (matchString[1].toUpperCase().contains("OLA")) {
isFrom = 1;
} else if (matchString[1].toUpperCase().contains("UBR")) {
isFrom = 2;
} else if (matchString[1].toUpperCase().contains("BK")) {
isFrom = 3;
} else if (Utils.isBankMessage(matchString[1].toUpperCase())) {
isFrom = 3;
} else if (cursor.getString(cursor.getColumnIndexOrThrow("body")).toUpperCase().contains("BANK")) {
isFrom = 3;
} else if (matchString[1].toUpperCase().contains("PAYTM")) {
isFrom = 4;
} else if (matchString[2].toUpperCase().contains("VK-iPaytm") || matchString[2].toUpperCase().contains("AD-IPAYTM")) {
isFrom = 4;
} else {
isFrom = 5;
}
// check if message has otp or not
String smsBody = cursor.getString(cursor.getColumnIndexOrThrow("body"));
if (!Utils.isContainAnyTypeOfCode(smsBody)) {
SMSModel sms = new SMSModel();
sms.setId(messageAddress);
sms.setBody(cursor.getString(cursor.getColumnIndexOrThrow("body")).toString());
sms.setAddress(cursor.getString(cursor.getColumnIndexOrThrow("address")).toString());
sms.setType(String.valueOf(isFrom));
long date = cursor.getLong(cursor.getColumnIndex("date"));
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy", Locale.ENGLISH);
String dateString = formatter.format(new Date(date));
sms.setDate(dateString);
if (isFrom > 0) {
CounterHolder.smsModelArrayList.add(cursor.getString(cursor.getColumnIndexOrThrow("body")).toString());
if (!datePreference.getBoolean("firstDump", false)) {
sms.setBody(cursor.getString(cursor.getColumnIndexOrThrow("body")));
CounterHolder.smsPromArrayList.add(sms);
Log.d("firstDump", "Processed");
} else if (datePreference.getBoolean("firstDump", false)) {
SimpleDateFormat fmtOut = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
if (Utils.isLatestSMS(context, fmtOut.format(new Date(date)))) {
Log.d("sms", "after first dump");
sms.setBody(cursor.getString(cursor.getColumnIndexOrThrow("body")));
CounterHolder.smsPromArrayList.add(sms);
} else {
Log.d("sms", "before first dump");
}
}
}
}
}
}
cursor.moveToNext();
}
cursor.close();
Log.d("myapp", "Count of sms" + CounterHolder.smsPromArrayList.size());
return true;
} catch (Exception e) {
e.printStackTrace();
}
现在,它抛出java.lang.ArrayIndexOutOfBoundsException:length = 2; index = 2异常。如何在不发生异常的情况下拆分字符串并进行匹配?
请帮助。谢谢。
答案 0 :(得分:2)
访问数组索引时,必须确保该索引有效。如果您的地址为BX-262735
,则您的数组大小为2。因此,在使用前检查有效的数组索引。
if ( matchString.length > 2 && matchString[2].toUpperCase().contains("some string") ) {
//.....
}
答案 1 :(得分:1)
"BX-262735 with"
在"-"
上拆分将导致包含两个元素的数组,但包含matchString[2]
您正在尝试访问该数组的第三个元素。这就是您的错误消息告诉您的。
答案 2 :(得分:1)
像这样更改或根据您的概念检查数组拆分是否正确
else if (matchString.length > 2 &&
matchString[2].toUpperCase().contains("VK-iPaytm") ||
matchString[2].toUpperCase().contains("AD-IPAYTM")) {
isFrom = 4;
}