2011-08-23 16 views
38

Sto tentando di eseguire un'iterazione tramite un elenco di chiavi da una tabella hash utilizzando l'enumerazione, tuttavia continuo a ricevere un NoSuchElementException sull'ultima chiave nell'elenco?iterando attraverso l'enumerazione delle chiavi hastable genera l'errore 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(); 
} 

uscita della console:

 
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) 

risposta

70

Si chiama nextElement() due volte nel vostro ciclo. Questa chiamata sposta il puntatore dell'enumerazione in avanti. Si dovrebbe modificare il codice come il seguente:

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

si sta chiamando nextElement due volte. Refactoring in questo modo:

while(e.hasMoreElements()){ 


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

si sta chiamando e.nextElement() due volte all'interno del ciclo quando si è garantita solo che si può chiamare una volta, senza eccezione. Riscrivere il ciclo in questo modo:

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

Ogni volta che si chiama e.nextElement() si prende l'oggetto successivo dal iteratore. Devi controllare e.hasMoreElement() tra ogni chiamata.


Esempio:

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

Questa sembra essere la prima risposta. È la risposta convalidata o mi manca qualcosa? –

+0

@PascalGanaye Questa risposta ha mancato l'errore contenuto nella domanda. – Svish

1

Ogni volta che fate e.nextElement() si salta uno. Quindi salti due elementi in ogni iterazione del tuo loop.

3

Stai chiamando nextElement due volte nel ciclo. Si dovrebbe chiamare solo una volta, il resto si muove avanti due volte:

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

molto meglio della soluzione loop while !! –

+20

Massively inefficient! 'Collections.list' crea un nuovo' ArrayList' e copia ciascun valore dall'enumerazione nel nuovo elenco prima di restituire il riferimento all'elenco. Un prezzo molto alto da pagare per una sintassi carina. –

+2

@AndyBrown non se la tua lista è piccola o non molto grande. E .. la sintassi carina aiuta a rendere il codice più chiaro. –

Problemi correlati