[java] ArrayIndexOutOfBoundsException при использовании итератора ArrayList


Answers

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

Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
    //Do something with obj
}
Question

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

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 должным образом.




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

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
}



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




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

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




Related