103 votes

ArrayIndexOutOfBoundsException lors de l'utilisation de l'itérateur 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 String value
     if( arrayList.iterator().next().equals(value)) {
          // do something 
     }
}

Est-ce que je fais bien ça, en ce qui concerne l'itération dans la liste de tableaux ?

L'erreur que je reçois est la suivante :

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 bien le reste du code, mais il est assez étendu, et si je ne fais pas l'itération correctement, je suppose que la seule possibilité est que je n'initialise pas le fichier ArrayList correctement.

228voto

larsmans Points 167484

Est-ce que je fais bien ça, en ce qui concerne l'itération dans la liste de tableaux ?

Non : en appelant iterator deux fois dans chaque itération, vous obtenez de nouveaux itérateurs tout le temps.

La façon la plus simple d'écrire cette boucle est d'utiliser la fonction pour-each construire :

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

Quant à

java.lang.ArrayIndexOutOfBoundsException: -1

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

142voto

NemesisX00 Points 1456

Bien que je sois d'accord que la réponse acceptée est généralement la meilleure solution et certainement plus facile à utiliser, j'ai remarqué que personne n'a montré l'utilisation correcte de l'itérateur. Voici donc un exemple rapide :

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

37voto

zacheusz Points 4661
List<String> arrayList = new ArrayList<String>();
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
    }
}

Mais soyez prudent ArrayList peut contenir des valeurs nulles . La comparaison devrait donc ê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.

10voto

subbu Points 149

Vous pouvez aussi utiliser comme ceci :

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

C'est une bonne pratique de couler et d'utiliser l'objet. Par exemple, si le 'arrayList' contient une liste d'objets 'Object1'. Alors, nous pouvons réécrire le code comme suit :

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

8voto

Stas Jaro Points 2562

Vous pourriez aussi faire une boucle for comme 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));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X