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

我试图迭代通过使用枚举散列表中的键列表,但是我不断得到一个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(); } 

控制台输出:

电子邮件
邮编
线程“main”中的exceptionjava.util.NoSuchElementException:Hashtable枚举器
    在java.util.Hashtable $ Enumerator.nextElement(Unknown Source)
    在testscripts.webdrivertest.main(webdrivertest.java:47)

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

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

每次调用e.nextElement() ,都会从迭代器中获取下一个对象。 您必须在每个调用之间检查e.hasMoreElement()


例:

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

你正在调用nextElement两次。 像这样重构:

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

你只要在你的循环中调用e.nextElement()两次,只保证你可以调用一次而没有exception。 像这样重写循环:

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

你在循环中调用nextElement两次。 你应该只调用一次,否则它会前进两次:

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

每次你做e.nextElement()你跳过一个。 所以你跳过循环的每个迭代中的两个元素。