2011-08-23 16 views
38

Estoy tratando de iterar a través de una lista de claves de una tabla hash usando enumeración, sin embargo sigo obteniendo una NoSuchElementException en la última clave de la lista?iterando a través de la enumeración de teclas hastable lanza error NoSuchElementException

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(); 
} 

salida de la consola:

 
EMAIL 
POSTCODE 
 
Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator 
    at java.util.Hashtable$Enumerator.nextElement(Unknown Source) 
    at testscripts.webdrivertest.main(webdrivertest.java:47) 

Respuesta

70

Usted llama nextElement() dos veces en el bucle. Esta llamada mueve el puntero de enumeración hacia adelante. Debe modificar el código como el siguiente:

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

que está llamando nextElement dos veces. Refactor así:

while(e.hasMoreElements()){ 


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

Estás llamando e.nextElement() dos veces dentro de su bucle cuando sólo se tiene la garantía de que se le puede llamar una vez sin excepción. Reescribir el bucle de esta manera:

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

Cada vez que llame e.nextElement() se toma el siguiente objeto del iterador. Debe marcar e.hasMoreElement() entre cada llamada.


Ejemplo:

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

Esta parece ser la primera respuesta. Será la respuesta validada o me falta algo? –

+0

@PascalGanaye Esta respuesta falló el error que contenía la pregunta. – Svish

1

Cada vez que haces e.nextElement() se salta uno. Así que saltas dos elementos en cada iteración de tu ciclo.

3

Llamas a nextElement dos veces en el ciclo. Debe llamar una sola vez, de lo que se mueve por delante en dos ocasiones:

while(e.hasMoreElements()){ 
    String s = e.nextElement(); 
    System.out.println(s); 
} 
52
for (String key : Collections.list(e)) 
    System.out.println(key); 
+1

mucho mejor que la solución while loop !! –

+20

¡Masivamente ineficiente! 'Collections.list' crea una nueva' ArrayList' y copia cada valor de la enumeración en la nueva lista antes de devolver la referencia de la lista. Un precio muy alto para pagar la sintaxis bonita. –

+2

@AndyBrown no si su lista es pequeña o no muy grande. Y ... la sintaxis linda ayuda a hacer que el código sea más claro. –

Cuestiones relacionadas