ArrayIndexOutOfBoundsException quando si utilizza l’iteratore di ArrayList

In questo momento, ho un programma contenente un pezzo di codice che assomiglia a questo:

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

Lo sto facendo bene, per quanto riguarda l’iterazione con l’ArrayList?

L’errore che sto ottenendo è:

 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) 

Mostrerei il resto del codice, ma è piuttosto esteso e, se non eseguo correttamente l’iterazione, suppongo che l’unica possibilità sia che non sto inizializzando correttamente l’ ArrayList .

Lo sto facendo bene, per quanto riguarda l’iterazione attraverso l’Arraylist?

No: chiamando iterator due volte in ogni iterazione, ricevi sempre nuovi iteratori.

Il modo più semplice per scrivere questo ciclo è usare il costrutto for-each :

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

Quanto a

java.lang.ArrayIndexOutOfBoundsException: -1

Hai appena provato a ottenere il numero elemento -1 da un array. Il conteggio inizia da zero.

Mentre sono d’accordo sul fatto che la risposta accettata è solitamente la soluzione migliore e sicuramente più semplice da usare, ho notato che nessuno ha mostrato l’uso corretto dell’iteratore. Quindi ecco un rapido esempio:

 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 } } 

o

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

Ma attenzione! ArrayList può contenere valori nulli . Quindi la comparazione dovrebbe essere

 value.equals(arrayList.get(i)) 

quando sei sicuro che il valore non è nullo o dovresti controllare se l'elemento dato è nullo.

Puoi anche usare in questo modo:

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

È una buona pratica per lanciare e usare l’object. Ad esempio, se ‘arrayList’ contiene un elenco di oggetti ‘Object1’. Quindi, possiamo riscrivere il codice come:

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

Potresti anche fare un ciclo for come faresti per un array ma invece di array [i] useresti list.get (i)

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

A parte la risposta di larsman (che è effettivamente corretta), l’eccezione in una chiamata a un metodo get (), quindi il codice che hai postato non è quello che sta causando l’errore.

Un modo efficiente per iterare il tuo ArrayList seguito da questo link . Questo tipo migliorerà le prestazioni del loop durante l’iterazione

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

l’iterazione con iteratore non è sicura, ad esempio se si aggiunge un elemento alla raccolta dopo la creazione di un iteratore, verrà lanciata un’intensità di simulazione simultanea. Inoltre non è thread-safe, devi renderlo thread safe esternamente.

Quindi è meglio usare per ogni struttura di ciclo for. È sicuro da errori.