Iterator迭代器导致的java.util.NoSuchElementException原因与解决方法

我:今天使用迭代器出现了java.util.NoSuchElementException错误,搜索到了解决办法。还是对迭代器next()没有深入了解。以下:


本文尊重原创

http://blog.csdn.net/a503921892/article/details/23061341


简单的说:

原因:循环中不能用两次(含)的next()方法。

解决方法:将next()取出的数据先传给一个新的对象,用的时候再想方法取出来。


我们可以在JDK文档中看到 Iterator 的三个方法(如下表),Java.util.NoSuchElementException是由next()导致的!见下面红字


方法摘要
booleanhasNext()
如果仍有元素可以迭代,则返回 true
Enext()
返回迭代的下一个元素。
voidremove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

next

E next()
返回迭代的下一个元素。
返回:
迭代的下一个元素。
抛出:

NoSuchElementException - 没有元素可以迭代。      ←就是这里

异常代码如下:

[java]  view plain  copy
  1. //用迭代器遍历hashMap,并方符合条件时返回值,常识:迭代器初始位置指在在列表第一个数据的上面,而不是指在第一个数据!重点是next()方法不能在循环中调用两次,否则会报java.util.NoSuchElementException  
  2. boolean isOk = false;  
  3. Iterator<Map.Entry<String, String>>  iter = map.entrySet().iterator();  
  4. while(iter.hasNext()){ //hashNext()  
  5.           
  6. <span style="white-space:pre">  </span>if(name.equals(iter.next().getKey())){//next()一次  
  7.                   
  8.         System.out.println("姓名:" + iter.next().getKey();//两次  
  9.         System.out.println("电话:" + iter.next().getValue();//三次  
  10.         isOk = true;  
  11.         break;  
  12.     }  
  13. }  
  14.     if(isOk) {  
  15.         //nothing     
  16.     }  
  17.     else{  
  18.         System.out.println("查无此人!");  
  19.     }  


改进过后的代码如下:

[java]  view plain  copy
  1. boolean isOk = false;  
  2. Iterator<Map.Entry<String, String>>  iter = map.entrySet().iterator();  
  3.           
  4. while(iter.hasNext()){  
  5. <span style="white-space:pre">  </span>Map.Entry<String, String> index = iter.next();<span style="font-family: Arial, Helvetica, sans-serif;">//next() 仅此一次,创建了一个新对象,并将next()取出的值传给它</span>  
  6.   
  7.     String outname = index.getKey();//再将值取出  
  8.     String outnumber = index.getValue();<span style="font-family: Arial, Helvetica, sans-serif;">//再将值取出</span>  
  9.   
  10.               
  11.     if(name.equals(outname)){//这里也不用next()方法了  
  12.         System.out.println("姓名:" + outname);  
  13.         System.out.println("电话:" + outnumber);  
  14.         isOk = true;  
  15.         break;  
  16.     }  
  17. }  
  18. <span style="white-space:pre">  </span>if(isOk) {  
  19.             //nothing  
  20.     }  
  21. <span style="white-space:pre">  </span>else{  
  22.     <span style="white-space:pre">  </span>System.out.println("查无此人!");  
  23.     }  

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值