我正在尝试使用枚举来迭代哈希表中的键列表,但是我在列表中的最后一个键处不断收到 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();
}
控制台输出:
邮箱 邮政编码
线程“main”中的异常 java.util.NoSuchElementException:哈希表枚举器 在 java.util.Hashtable$Enumerator.nextElement(来源未知) 在 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()
两次。像这样重写循环:
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()
,您就会跳过一个。因此,您在循环的每次迭代中跳过两个元素。
您也可以使用
for
循环。每次迭代后,它都会检查 e.hasMoreElements()
并将 a 设置为 e.nextElement()
:
for(String a = e.nextElement(); e.hasMoreElements(); a = e.nextElement()) {
System.out.println(a);
}
注意:如果预期
Enumeration
为空,则必须先检查 if(e.nextElement())
,然后再在 String a = e.nextElement()
循环中设置值 for
。