web-dev-qa-db-ja.com

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();
}

コンソール出力:

メール
 POSTCODE 
スレッド「メイン」の例外Java.util.NoSuchElementException:Hashtable Enumerator 
 at Java.util.Hashtable $ Enumerator.nextElement(Unknown Source)
 at testscripts.webdrivertest.main( webdrivertest.Java:47)

54

ループでnextElement()を2回呼び出します。この呼び出しは、列挙ポインターを前方に移動します。次のようにコードを変更する必要があります。

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

e.nextElement()を呼び出すたびに、イテレータから次のオブジェクトを取得します。各呼び出しの間にe.hasMoreElement()を確認する必要があります。


例:

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

NextElementを2回呼び出しています。このようなリファクタリング:

while(e.hasMoreElements()){


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

ループ内でe.nextElement()を2回呼び出しているのは、例外なしで1回しか呼び出せないことが保証されている場合です。ループを次のように書き換えます。

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

ループ内でnextElementを2回呼び出しています。 1回だけ呼び出す必要があります。それ以外の場合は、2回呼び出します。

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

e.nextElement()を実行するたびに1つスキップします。したがって、ループの各反復で2つの要素をスキップします。

1
cadrian