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

问题描述 投票:0回答:8

我正在尝试使用枚举来迭代哈希表中的键列表,但是我在列表中的最后一个键处不断收到 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)

java hashtable enumeration key
8个回答
135
投票

您在循环中调用

nextElement()
两次。该调用将枚举指针向前移动。 您应该像下面这样修改您的代码:

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

80
投票
for (String key : Collections.list(e))
    System.out.println(key);

11
投票

每次调用

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


示例:

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

4
投票

您调用了 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);
}

3
投票

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

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

1
投票

每执行一次

e.nextElement()
,您就会跳过一个。因此,您在循环的每次迭代中跳过两个元素。


0
投票

您也可以使用

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

© www.soinside.com 2019 - 2024. All rights reserved.