2011-08-23 7 views
38

Próbuję iterować listę kluczy z tabeli mieszania, używając wyliczeń, ale ciągle otrzymuję wyjątek NoSuchElementException na ostatnim kluczu na liście?iterowanie poprzez wyliczanie szybkich kluczy powoduje błąd 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(); 
} 

wyjście konsoli:

 
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) 

Odpowiedz

70

zadzwonić nextElement() dwa razy w pętli. To wywołanie przesuwa wskaźnik wyliczenia do przodu. Należy zmodyfikować kod tak:

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

Telefonujesz nextElement dwukrotnie. Byłaby tak:

while(e.hasMoreElements()){ 


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

Dzwonisz e.nextElement() dwukrotnie wewnątrz pętli, gdy masz gwarantowane tylko, że można nazwać go raz bez wyjątku. Przepisz pętlę tak:

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

każdym razem dzwonić e.nextElement() wziąć następnego obiektu z iteracyjnej. Musisz sprawdzić e.hasMoreElement() między każdą rozmową.


Przykład:

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

To wydaje się być pierwszą odpowiedź. To jest sprawdzona odpowiedź, czy coś mi brakuje? –

+0

@PascalGanaye Ta odpowiedź pominęła błąd związany z tym pytaniem. – Svish

1

każdym razem robisz e.nextElement() pominąć jeden. Pomijasz więc dwa elementy w każdej iteracji swojej pętli.

3

Dwa razy wywołujesz nextElement w pętli. Należy nazwać tylko raz, jeszcze porusza się do przodu dwukrotnie:

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

o wiele lepiej niż rozwiązanie pętli while! –

+20

Bardzo mało wydajne! 'Collections.list' tworzy nową' ArrayList' i kopiuje każdą wartość z wyliczenia na nową listę przed zwróceniem odwołania do listy. Bardzo duża cena za sprytną składnię. –

+2

@AndyBrown nie, jeśli twoja lista jest mała lub niezbyt duża. I ... urocza składnia pomaga w poprawieniu kodu. –