访问字符串数组时获取ArrayIndexOutOfBoundException

时间:2018-10-03 06:09:53

标签: java android arrays string indexoutofboundsexception

我正在尝试分割字符串并将其与常量字符串匹配。我得到了要检查发件人的地址字符串,以尝试拆分字符串。为此,我尝试了这种方式。

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异常。如何在不发生异常的情况下拆分字符串并进行匹配?

请帮助。谢谢。

3 个答案:

答案 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;
}