зацикливание в массиве адресов?

1

Я начинаю в java, и я пытаюсь закодировать массив адресов (адрес []), но я не знаю размер массива и не могу проверить конечную точку массива. это мой код:

int j=0;
              System.out.println(j);
              while(msg.getRecipients(Message.RecipientType.CC)[j]!=null)
             {cc =cc.concat(msg.getRecipients(Message.RecipientType.CC)[j].toString());
             cc =cc.concat(",");
             j++;
             System.out.println(j);}  

          }

в основном msg.getRecipients(Message.RecipientType.CC) является массивом адреса типа, и когда irun это, я получаю ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at test2.main(test2.java:135)
  • 0
    вы не можете сделать myarray[j] если j выходит за пределы вашего массива, так как он возвращает исключение, которое вы получили. Тем не менее, вы можете проверить длину массива, используя myarray.length . Это работает с любым массивом и позволяет легко перебирать массив с циклом for , например, for (int j=0; j<myarray.length;j++){myarray[j]=...}
Теги:
error-handling
imap

5 ответов

0
Лучший ответ

Из JLS есть

public final length поля -

Итак, это должно быть что-то вроде -

int j=0;
while(j < msg.getRecipients(Message.RecipientType.CC).length)
{
  System.out.println(j);
  cc = cc.concat(msg.getRecipients(Message.RecipientType.CC)[j].toString());
  cc = cc.concat(",");
  j++;
}
  • 0
    Большое спасибо! Эллиотт
  • 0
    Новый стиль for () делает его еще короче: for (Адрес a: msg.getRecipients (Message.RecipientType.CC)) System.out.println (a);
Показать ещё 1 комментарий
0

Самое главное здесь понять, что вы всегда знаете размер массива в Java, и вы можете получить к нему доступ, используя атрибут длины массива, например myArray.length. Кроме того, есть несколько областей, где ваш подход может быть улучшен:

  • Вы получаете массив каждый раз, когда вокруг в while цикла, который может работать нормально, но это лишняя работа. Просто возьмите массив один раз, а затем зациклите его содержимое.
  • Если ваша переменная cc является String тогда имейте в виду, что строки неизменяемы, а это означает, что каждый раз, когда вы вызываете concat вы создаете новый объект String. Это не очень эффективный способ динамического наращивания строки с использованием цикла. Хорошей практикой было бы использовать StringBuilder (который изменен) для создания окончательного текста, а затем преобразовать его в String когда вы закончите.

Ваш код может выглядеть примерно так:

StringBuilder recipients = new StringBuilder();
Address[] ccs = msg.getRecipients(Message.RecipientType.CC);
for (int i = 0; i < ccs.length; i++)
{
  if (i > 0) recipients.append(",");
  recipients.append(ccs[i]);
}

String result = recipients.toString();
0

Если вы посмотрите на этот учебник, вы увидите, что существует переменная с именем length которая содержит размер массива. И что for-loop лучше подходит для того, что вы хотите достичь

for(int i = 0; i < array.length; i++) {
    //do stuff with array[i]
}
  • 0
    Не .length() просто .length в случае массивов.
  • 0
    да, извини ...
0

вы пытались использовать msg.getRecipients(Message.RecipientType.CC).length, который дает длину массива

0

Попробуй это:

int j=0;
System.out.println(j);
while(j < msg.getRecipients(Message.RecipientType.CC).length){
      cc =cc.concat(msg.getRecipients(Message.RecipientType.CC)[j].toString());
      cc =cc.concat(",");
      j++;
      System.out.println(j);  
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню