A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xcfdszzr 中级黑马   /  2015-4-22 13:25  /  3985 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
for (Iterator<String> it = list.iterator(); iter.hasNext(); ) {  
      
    if (Integer.parseInt(it.next()) % 3 == 0 ) {  
         
        li.remove(it.next());  
    }  
      
    System.out.println(list.size() + "");  
}
这样会报错为什么

最佳答案

查看完整内容

for语句中变量名写错了,for(Iteratro it = list.iterator();it.hasNext();). 假设list只有一个元素,判断完if语句的的it.next()后,指针指向下一个元素,但是此时list集合中没有下一个元素,就会报NoSuchElementException异常,要解决的话在迭代时把it.next() 赋值给Sting s 变量,然后去引用s就没有问题了

10 个回复

倒序浏览
for语句中变量名写错了,for(Iteratro<String> it = list.iterator();it.hasNext();). 假设list只有一个元素,判断完if语句的的it.next()后,指针指向下一个元素,但是此时list集合中没有下一个元素,就会报NoSuchElementException异常,要解决的话在迭代时把it.next() 赋值给Sting s 变量,然后去引用s就没有问题了

评分

参与人数 1黑马币 +12 收起 理由
xcfdszzr + 12 神马都是浮云

查看全部评分

回复 使用道具 举报
因为存在线程并发问题

点评

为什么存在并发问题呢  发表于 2015-4-22 13:50
回复 使用道具 举报
说一下吧,在if(Integer.parseInt(it.next()))中,如果it.next代表的如果是脚标为0的元素,那么li.remove(it.next());中代表的元素是就脚标为1的元素。所以报错是因为,如果前面已经到达最后一个元素,后面一个就会越界。你如果要移除的是前面一个元素的话,可以在if语句前用String str=it.next();将it.next的值赋给str,这样以后引用str就不会出现问题。
回复 使用道具 举报
集合的remove和迭代器中的remove不能同时进行。会发生并发运行异常。
回复 使用道具 举报
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
                public static void main(String[] args) {
                        ArrayList<String> list=new ArrayList<String>();
                        list.add("1");
                        list.add("2");
                        list.add("3");
                        list.add("4");
                        list.add("5");
                        list.add("6");
                        list.add("7");
                        list.add("8");
                        list.add("9");
                        list.add("10");
                        Iterator<String> it = list.iterator();
                        for (int x = 0; x < list.size(); x++) {
                                        if (Integer.parseInt(list.get(x)) %3 == 0 ) {  
                                                list.remove(list.get(x));
                                                x--;
                                        }  
                                }System.out.println(list.size() + "");  
                        }
                }
回复 使用道具 举报
One_M 中级黑马 2015-4-24 01:07:27
7#
for里面条件有误吧...
回复 使用道具 举报
澂澂 中级黑马 2015-4-26 15:41:42
8#
不能在list遍历的时候删除元素,想要删除,就要通过list的迭代器遍历来删除
回复 使用道具 举报
list在迭代过程中不能修改

你正在迭代中
你修改了它 那么next怎么办.
回复 使用道具 举报
有两个错误,一个是for (Iterator<String> it = list.iterator(); iter.hasNext(); ) 第二表达式写错了;应该是it.hasNext();第二个错误是,在迭代器遍历元素的时候不能用集合修改集合中的元素;因为迭代器是依赖于集合的,你在便利的时候修改了集合,这时候集合中的元素已经改变,而迭代器中的元素却没有改变。这时候就会发生并发修改异常ConcurrentModificationException;解决这个问题有两个;一是全部操作有集合完成,二是全部操作都用迭代器完成。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马