ArrayIndexOutOfBoundsException при использовании iteratorа ArrayList

Прямо сейчас у меня есть программа, содержащая fragment кода, который выглядит так:

while (arrayList.iterator().hasNext()) { //value is equal to a String value if( arrayList.iterator().next().equals(value)) { // do something } } 

Правильно ли я делаю это, если итерация через ArrayList идет?

Ошибка, которую я получаю:

 java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.ArrayList.get(Unknown Source) at main1.endElement(main1.java:244) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at javax.xml.parsers.SAXParser.parse(Unknown Source) at javax.xml.parsers.SAXParser.parse(Unknown Source) at main1.traverse(main1.java:73) at main1.traverse(main1.java:102) at main1.traverse(main1.java:102) at main1.main(main1.java:404) 

Я бы показал остальную часть кода, но он довольно обширен, и если я не буду делать итерацию правильно, я бы предположил, что единственная возможность заключается в том, что я не инициализирую ArrayList должным образом.

    Правильно ли я поступаю так, как идет итерация через аррайалист?

    Нет: вызывая iterator дважды на каждой итерации, вы все время получаете новые iteratorы.

    Самый простой способ написать этот цикл – использовать для каждой конструкции:

     for (String s : arrayList) if (s.equals(value)) // ... 

    Что касается

    java.lang.ArrayIndexOutOfBoundsException: -1

    Вы просто пытались получить номер элемента -1 из массива. Счет начинается с нуля.

    Хотя я согласен с тем, что принятый ответ обычно является лучшим решением и определенно проще в использовании, я заметил, что никто не показал правильное использование iteratorа. Итак, вот краткий пример:

     Iterator it = arrayList.iterator(); while(it.hasNext()) { Object obj = it.next(); //Do something with obj } в Iterator it = arrayList.iterator(); while(it.hasNext()) { Object obj = it.next(); //Do something with obj } 
     List arrayList = new ArrayList(); for (String s : arrayList) { if(s.equals(value)){ //do something } } 

    или

     for (int i = 0; i < arrayList.size(); i++) { if(arrayList.get(i).equals(value)){ //do something } } 

    Но будьте осторожны: ArrayList может содержать нулевые значения . Поэтому сравнение должно быть

     value.equals(arrayList.get(i)) 

    когда вы уверены, что значение не является нулевым, или вы должны проверить, имеет ли данный элемент значение null.

    Вы также можете использовать следующее:

     for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) { x = iterator.next(); //do some stuff } 

    Это хорошая практика для использования и использования объекта. Например, если «arrayList» содержит список объектов Object1. Затем мы можем переписать код следующим образом:

     for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) { x = (Object1) iterator.next(); //do some stuff } 

    Вы также можете сделать цикл for, как и для массива, но вместо массива [i] вы должны использовать list.get (i)

     for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 

    Помимо larsmans отвечают (кто действительно прав), исключение в вызове метода get (), поэтому код, который вы отправили, не является тем, который вызывает ошибку.

    Эффективный способ повторить ваш ArrayList за которым следует эта ссылка . Этот тип улучшит производительность цикла во время итерации

     int size = list.size(); for(int j = 0; j < size; j++) { System.out.println(list.get(i)); } 

    итерация с использованием iteratorа не является отказоустойчивой, например, если вы добавляете элемент в коллекцию после создания iteratorа, то он будет вызывать одновременное исключение. Кроме того, он не является streamобезопасным, вы должны сделать его streamом безопасным извне.

    Поэтому лучше использовать для каждой структуры цикла for. Это по крайней мере безотказно.

    Давайте будем гением компьютера.