2011-08-23 56 views
38

我想從列表中使用枚舉哈希表遍歷列表中的鍵但是我不斷收到NoSuchElementException列表中的最後一個鍵?迭代通過枚舉hastable鍵拋出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(); 
} 

控制檯輸出:

 
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) 

回答

70

你在你的循環調用nextElement()兩次。這個調用向前移動枚舉指針。 您應該修改您的代碼如下所示:

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

要調用nextElement兩次。重構是這樣的:

while(e.hasMoreElements()){ 


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

你打電話e.nextElement()兩次你的循環裏面,當你只能保證你可以調用它一次沒有例外。重寫循環,像這樣:

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

每次通話時間e.nextElement()您從迭代器採取的下一個對象。您必須在每次通話之間檢查e.hasMoreElement()


例子:

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

這似乎是第一個回覆。 這是驗證的答案或我錯過了什麼? –

+0

@PascalGanaye這個答案錯過了包含問題的錯誤。 – Svish

1

每次做e.nextElement()時候你跳過一個。所以你在循環的每次迭代中跳過兩個元素。

3

你在循環中調用nextElement兩次。你應該把它只有一次,否則它向前移動兩次:

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

比while循環解決方案好得多! –

+20

大量低效! 'Collections.list'創建一個新的'ArrayList',並在返回列表引用之前將枚舉中的每個值複製到新列表中。一個非常大的代價爲可愛的語法付出。 –

+2

@AndyBrown如果你的名單很小或不是很大。而..可愛的語法有助於使代碼更清晰。 –