Подтвердить что ты не робот

Итерация через перечисление hastable ключей бросает ошибку NoSuchElementException

Я пытаюсь выполнить итерацию по списку ключей из хэш-таблицы с использованием перечисления, однако я продолжаю получать исключение 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)

4b9b3361

Ответ 1

Вы вызываете nextElement() дважды в свой цикл. Этот вызов переводит указатель перечисления вперед. Вы должны изменить свой код следующим образом:

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

Ответ 2

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

Ответ 3

Каждый раз, когда вы вызываете e.nextElement(), вы берете следующий объект из итератора. Вы должны проверить e.hasMoreElement() между каждым вызовом.


Пример:

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

Ответ 4

Вы вызываете следующий элемент дважды. Рефакторинг:

while(e.hasMoreElements()){


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

Ответ 5

Вы вызываете e.nextElement() дважды внутри своего цикла, когда вам гарантируется, что вы можете вызвать его один раз без исключения. Перепишите петлю так:

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

Ответ 6

Вы вызываете nextElement дважды в цикле. Вы должны называть его только один раз, иначе он перемещается вперед дважды:

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

Ответ 7

Каждый раз, когда вы делаете e.nextElement(), вы пропускаете один. Таким образом, вы пропускаете два элемента на каждой итерации цикла.