您的位置:首页 > 编程语言 > Java开发

【JAVA学习】Iterator迭代器导致的java.util.NoSuchElementException原因与解决方法

2014-04-07 01:03 429 查看
简单的说:

原因:循环中不能用两次(含)的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("查无此人!");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: