web-dev-qa-db-fra.com

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 me trompe, autant que faire se passe 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 le reste du code, mais il est assez volumineux et si je ne fais pas l’itération correctement, je suppose que la seule possibilité est que je n’initialise pas correctement la ArrayList.

102
This 0ne Pr0grammer

Est-ce que je me trompe, dans la mesure où cela se répète dans l'Arraylist?

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

Le moyen le plus simple d'écrire cette boucle est d'utiliser la construction pour-chacun :

for (String 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 décompte commence à zéro.

228
Fred Foo

Bien que je convienne 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 affiché le bon usage de l’itérateur. Alors voici un exemple rapide:

Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
    //Do something with obj
}
141
NemesisX00
List<String> arrayList = new ArrayList<String>();
for (String 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 soyez prudent ArrayList peut contenir des valeurs nulles. Donc, la comparaison devrait être

value.equals(arrayList.get(i))

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

37
zacheusz

Vous pouvez également utiliser comme ceci:

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

C'est une bonne pratique pour lancer et utiliser l'objet. Par exemple, si 'arrayList' contient une liste d'objets 'Object1'. Ensuite, nous pouvons réécrire le code en tant que:

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

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

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

À part larsmans answer (qui est en effet correct), l'exception d'un appel à une méthode get (), de sorte que le code que vous avez publié n'est pas celui qui a provoqué l'erreur.

7
SJuan76

Moyen efficace d'itérer votre ArrayList suivi de ceci lien . Ce type améliorera les performances de la boucle lors de l'itération

int size = list.size();

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

itérer à l'aide d'un itérateur n'est pas sûr, par exemple, si vous ajoutez un élément à la collection après la création d'un itérateur, il lancera alors une exceptionModificaionexception concurrente. En outre, il n'est pas thread-safe, vous devez le rendre thread-safe extérieurement.

Il est donc préférable d'utiliser for-chaque structure de for loop. C'est au moins un coffre-fort.

2
Sumit Kumar Saha