ArrayIndexOutOfBoundsException bei Verwendung des Iterators der ArrayList
Gerade jetzt, ich habe ein Programm mit einem Stück code, der wie folgt aussieht:
while (arrayList.iterator().hasNext()) {
//value is equal to a String value
if( arrayList.iterator().next().equals(value)) {
//do something
}
}
Mache ich das richtige, soweit das Durchlaufen der ArrayList geht?
Den Fehler bin ich immer:
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)
Ich würde zeigen Sie den rest des Codes, aber es ist ziemlich umfangreich, und wenn ich nicht gerade die iteration richtig, ich würde davon ausgehen, die einzige Möglichkeit ist, dass ich nicht die Initialisierung der ArrayList
richtig.
Kommentar zu dem Problem
In java 8 können Sie die
forEach
Methode: stackoverflow.com/questions/16635398/... InformationsquelleAutor der Frage This 0ne Pr0grammer | 2011-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht: durch den Aufruf
iterator
zweimal in jeder iteration, die Sie bekommen, neue Iteratoren die ganze Zeit.Der einfachste Weg zu schreiben, diese Schleife ist mit dem für-jeden konstruieren:
Als für
Du gerade versucht zu bekommen-element-Nummer
-1
aus einem array. Zählung beginnt bei null.InformationsquelleAutor der Antwort Fred Foo
Während ich damit einverstanden, dass die akzeptierte Antwort ist meist die beste Lösung und auf jeden Fall einfacher zu verwenden, die ich bemerkt niemand angezeigt, die richtige Verwendung der iterator. So, hier ist ein schnelles Beispiel:
InformationsquelleAutor der Antwort NemesisX00
oder
Aber Vorsicht ArrayList halten kann null-Werte. Also vergleichen sollte
wenn Sie sicher sind, dass Wert ist nicht null oder sollten Sie überprüfen, ob element null ist.
InformationsquelleAutor der Antwort zacheusz
Können Sie auch verwenden, wie diese:
Es ist eine gute Praxis zu werfen und das Objekt verwenden.
Zum Beispiel, wenn die 'arrayList' enthält eine Liste von 'Object1' - Objekte. Dann können wir re-den code schreiben als:
InformationsquelleAutor der Antwort subbu
Könnte man auch eine for-Schleife, wie Sie würde für ein array, aber statt array[i] verwenden Sie Liste.get(i)
InformationsquelleAutor der Antwort Stas Jaro
Abgesehen von larsmans Antwort (die ist in der Tat richtig ist), die Ausnahme in einem Aufruf einer get () - Methode, sodass der code, den Sie gepostet hast, ist nicht der, der den Fehler verursacht.
InformationsquelleAutor der Antwort SJuan76
Effiziente Art und Weise zu Durchlaufen Ihre
ArrayList
gefolgt von dieser link. Diese Art verbessert die Leistung looping während der iterationInformationsquelleAutor der Antwort RED.Skull
Durchlaufen mit iterator ist nicht fail-safe-zum Beispiel, wenn Sie element hinzufügen, um die Sammlung nach iterator-Erzeugung, dann wird es werfen concurrentmodificaionexception. Auch ist es nicht thread-sicher, Sie haben, um es thread-sicher extern.
So, es ist besser for-each-Struktur der for-Schleife. Es atleast fail-safe.
InformationsquelleAutor der Antwort Sumit Kumar Saha