Я начинаю в 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)
Из 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++;
}
Самое главное здесь понять, что вы всегда знаете размер массива в 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();
Если вы посмотрите на этот учебник, вы увидите, что существует переменная с именем length
которая содержит размер массива. И что for-loop лучше подходит для того, что вы хотите достичь
for(int i = 0; i < array.length; i++) {
//do stuff with array[i]
}
.length()
просто .length
в случае массивов.
вы пытались использовать msg.getRecipients(Message.RecipientType.CC).length, который дает длину массива
Попробуй это:
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);
}
myarray[j]
еслиj
выходит за пределы вашего массива, так как он возвращает исключение, которое вы получили. Тем не менее, вы можете проверить длину массива, используяmyarray.length
. Это работает с любым массивом и позволяет легко перебирать массив с цикломfor
, например,for (int j=0; j<myarray.length;j++){myarray[j]=...}