簡單的說:
原因:循環中不能用兩次(含)的next()方法。
解決方法:將next()取出的數據先傳給一個新的對象,用的時候再想方法取出來。
我們可以在JDK文檔中看到 Iterator 的三個方法(如下表),java.util.NoSuchElementException是由next()導致的!見下面紅字
方法摘要 | |
---|---|
boolean |
hasNext() 如果仍有元素可以迭代,則返回 true。 |
E |
next() 返回迭代的下一個元素。 |
void |
remove() 從迭代器指向的 collection 中移除迭代器返回的最後一個元素(可選操作)。 |
next
E next()
- 返回迭代的下一個元素。
-
- 返回:
- 迭代的下一個元素。
- 拋出:
NoSuchElementException
- 沒有元素可以迭代。 ←就是這裏
//用迭代器遍歷hashMap,並方符合條件時返回值,常識:迭代器初始位置指在在列表第一個數據的上面,而不是指在第一個數據!重點是next()方法不能在循環中調用兩次,否則會報java.util.NoSuchElementException
boolean isOk = false;
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while(iter.hasNext()){ //hashNext()
if(name.equals(iter.next().getKey())){//next()一次
System.out.println("姓名:" + iter.next().getKey();//兩次
System.out.println("電話:" + iter.next().getValue();//三次
isOk = true;
break;
}
}
if(isOk) {
//nothing
}
else{
System.out.println("查無此人!");
}
boolean isOk = false;
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String, String> index = iter.next();//next() 僅此一次,創建了一個新對象,並將next()取出的值傳給它
String outname = index.getKey();//再將值取出
String outnumber = index.getValue();//再將值取出
if(name.equals(outname)){//這裏也不用next()方法了
System.out.println("姓名:" + outname);
System.out.println("電話:" + outnumber);
isOk = true;
break;
}
}
if(isOk) {
//nothing
}
else{
System.out.println("查無此人!");
}