迭代通过枚举hastable键会抛出NoSuchElementException错误

Dav*_*ham 56 java enumeration hashtable key

我试图使用枚举迭代哈希表中的键列表但是我一直在列表中的最后一个键获得NoSuchElementException?

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

vars.put("POSTCODE","TU1 3ZU");
vars.put("EMAIL","job.blogs@lumesse.com");
vars.put("DOB","02 Mar 1983");

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

while(e.hasMoreElements()){

System.out.println(e.nextElement());
String param = (String) e.nextElement();
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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)

Ale*_*exR 102

nextElement()在循环中调用两次.此调用将枚举指针向前移动.您应该修改您的代码,如下所示:

while (e.hasMoreElements()) {
    String param = e.nextElement();
    System.out.println(param);
}
Run Code Online (Sandbox Code Playgroud)


小智 65

for (String key : Collections.list(e))
    System.out.println(key);
Run Code Online (Sandbox Code Playgroud)

  • 效率极低!`Collections.list`创建一个新的`ArrayList`,并在返回列表引用之前将枚举中的每个值复制到新列表中.可爱的语法需要付出很大的代价. (23认同)
  • @AndyBrown如果你的名单很小或不是很大,那就不行了.并且..可爱的语法有助于使代码更清晰. (4认同)
  • @AndyBrown这不是非常低效的.它是O(2n)vs O(n),相同的数量级.对于足够大的列表,有可能通过并行流和正确的硬件,迭代列表会更快. (3认同)

dac*_*cwe 10

每次调用时e.nextElement()都从迭代器中获取下一个对象.你必须e.hasMoreElement()在每次通话之间进行检查.


例:

while(e.hasMoreElements()){
    String param = e.nextElement();
    System.out.println(param);
}
Run Code Online (Sandbox Code Playgroud)