web-dev-qa-db-fra.com

itération via l'énumération des clés hastables génère l'erreur NoSuchElementException

J'essaie de parcourir une liste de clés à partir d'une table de hachage à l'aide de l'énumération, mais je continue à recevoir une exception NoSuchElementException à la dernière clé de la liste?

Hashtable<String, String> vars = new Hashtable<String, String>();

vars.put("POSTCODE","TU1 3ZU");
vars.put("EMAIL","[email protected]");
vars.put("DOB","02 Mar 1983");

Enumeration<String> e = vars.keys();

while(e.hasMoreElements()){

System.out.println(e.nextElement());
String param = (String) e.nextElement();
}

Sortie de la console:

 EMAIL 
 CODE POSTAL 
 Exception dans le fil "principal" Java.util.NoSuchElementException: Hashtable Enumerator 
 À Java.util.Hashtable $ Enumerator.nextElement (Source inconnue) 
 À testscripts.webdrivertest.main ( webdrivertest.Java:47)

54
David Cunningham

Vous appelez nextElement() deux fois dans votre boucle. Cet appel fait avancer le pointeur d’énumération. Vous devriez modifier votre code comme suit:

while (e.hasMoreElements()) {
    String param = e.nextElement();
    System.out.println(param);
}
99
AlexR
for (String key : Collections.list(e))
    System.out.println(key);
62
user3162459

Chaque fois que vous appelez e.nextElement(), vous prenez le prochain objet de l'itérateur. Vous devez vérifier e.hasMoreElement() entre chaque appel.


Exemple:

while(e.hasMoreElements()){
    String param = e.nextElement();
    System.out.println(param);
}
9
dacwe

Vous appelez nextElement deux fois. Refactor comme ceci:

while(e.hasMoreElements()){


String param = (String) e.nextElement();
System.out.println(param);
}
4
Heisenbug

Vous appelez e.nextElement() deux fois dans votre boucle lorsque vous êtes seulement assuré de pouvoir l'appeler une fois sans exception. Réécrivez la boucle comme suit:

while(e.hasMoreElements()){
  String param = e.nextElement();
  System.out.println(param);
}
3
Edward Dale

Vous appelez nextElement deux fois dans la boucle. Vous ne devriez l'appeler qu'une fois, sinon il avance deux fois:

while(e.hasMoreElements()){
    String s = e.nextElement();
    System.out.println(s);
}
3
JB Nizet

Chaque fois que vous faites e.nextElement() vous en sautez un. Donc, vous sautez deux éléments à chaque itération de votre boucle.

1
cadrian