ArrayIndexOutOfBoundsException lors de l’utilisation de l’iterator de ArrayList

En ce moment, j’ai un programme contenant un morceau de code qui ressemble à ceci:

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

Est-ce que je le fais bien, en ce qui concerne les itérations dans ArrayList?

L’erreur que j’obtiens est:

 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) 

Je montrerais le rest du code, mais c’est assez complet, et si je ne fais pas correctement l’itération, je suppose que la seule possibilité est que je n’initialise pas correctement ArrayList .

Est-ce que je le fais bien, en ce qui concerne les itérations à travers l’Arraylist?

Non: en appelant deux fois l’ iterator à chaque itération, vous obtenez tout le temps de nouveaux iterators.

La manière la plus simple d’écrire cette boucle est d’utiliser la construction for-each :

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

Pour ce qui est de

java.lang.ArrayIndexOutOfBoundsException: -1

Vous venez d’essayer d’obtenir le numéro d’élément -1 d’un tableau. Le comptage commence à zéro.

Bien que je sois d’accord que la réponse acceptée est généralement la meilleure solution et qu’elle est nettement plus facile à utiliser, j’ai remarqué que personne ne affichait le bon usage de l’iterator. Voici donc un exemple rapide:

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

ou

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

Mais attention, ArrayList peut contenir des valeurs nulles . Donc, la comparaison devrait être

 value.equals(arrayList.get(i)) 

lorsque vous êtes sûr que la valeur n'est pas nulle ou que vous devez vérifier si l'élément donné est nul.

Vous pouvez également utiliser comme ceci:

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

C’est une bonne pratique de lancer et d’utiliser l’object. Par exemple, si la liste ‘arrayList’ contient une liste d’objects ‘Object1’. Ensuite, nous pouvons ré-écrire le code comme:

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

Vous pourriez aussi faire une boucle for comme vous le feriez pour un tableau mais au lieu de array [i] vous utiliseriez list.get (i)

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

En dehors de larsmans answer (qui est en effet correct), l’exception dans un appel à une méthode get (), le code que vous avez publié n’est donc pas celui qui provoque l’erreur.

Un moyen efficace d’itérer votre ArrayList suivi de ce lien . Ce type améliorera les performances du bouclage pendant l’itération

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

itérer en utilisant un iterator n’est pas sûr, par exemple si vous ajoutez un élément à la collection après la création de l’iterator, il lancera une exception simultanée. En outre, ce n’est pas un thread sûr, vous devez le rendre sûr en externe.

Il vaut donc mieux utiliser pour chaque structure de for loop. C’est au moins sûr.