列挙を使用してハッシュテーブルからキーのリストを反復処理しようとしていますが、リストの最後のキーで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)
ループでnextElement()
を2回呼び出します。この呼び出しは、列挙ポインターを前方に移動します。次のようにコードを変更する必要があります。
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を2回呼び出しています。このようなリファクタリング:
while(e.hasMoreElements()){
String param = (String) e.nextElement();
System.out.println(param);
}
ループ内でe.nextElement()
を2回呼び出しているのは、例外なしで1回しか呼び出せないことが保証されている場合です。ループを次のように書き換えます。
while(e.hasMoreElements()){
String param = e.nextElement();
System.out.println(param);
}
ループ内でnextElementを2回呼び出しています。 1回だけ呼び出す必要があります。それ以外の場合は、2回呼び出します。
while(e.hasMoreElements()){
String s = e.nextElement();
System.out.println(s);
}
e.nextElement()
を実行するたびに1つスキップします。したがって、ループの各反復で2つの要素をスキップします。