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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.socket.all;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.Scanner;

  5. public class myList extends ArrayList<Object> {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 ArrayList list = new ArrayList();

  12.                 Scanner scanner = new Scanner(System.in);
  13.                 System.out.println("请选择输入元素个数:");
  14.                 int sumObject = scanner.nextInt();
  15.                 for (int i = 0; i < sumObject; i++) {
  16.                         list.add(scanner.nextInt());
  17.                 }
  18.                 Iterator it = list.iterator();
  19.                 while (it.hasNext()) {
  20.                         list.removeRange(2,3);//JDK api分明是有这个函数的,可是这里怎么报错了?编译器的问题吗?
  21.                         System.out.println(it.next());
  22.                 }
  23.         }

  24. }
复制代码

4 个回复

倒序浏览
myList list = new myList();
回复 使用道具 举报
迭代过程中,不能用List集合的方法操作,因为这时候迭代器对其进行操作,相当于多线操作,有安全隐患,虚拟机报错
回复 使用道具 举报
这个是ConcurrentModificationException ,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。也就是说,在迭代器内部,不能对list集合进行改变;要想解决该错误,建议使用for循环,在循环内部进行改变for(int i=0;i<list.size();i++){
list.removeRange(2,3);
}
回复 使用道具 举报
楼主的问题出在迭代器的使用上,为了方便观看,我就复制了迭代的那段代码

  1. <P> </P>
复制代码

  1. <P>Iterator it = list.iterator();
  2. while (it.hasNext()) {
  3. list.removeRange(2,3);//api 中出现这个方法没错,但是在ArrayList中,而不是迭代器中。这里提示迭代器中找不到次方法。</P>
  4. <P>System.out.println(it.next());
  5. }</P>
复制代码
所以你只有通过for循环,get()和size()方法来进行遍历操作,然后选择你的删除集合内元素的操作。
这里说一下并发修改异常。
是先创建了迭代器,这个时候。迭代器内已经加载好集合中的元素了。迭代器是以来集合存在的,在迭代的过程中,如果通过调用方法来修改元素,就相当于改变了迭代器,而迭代器是在循环外得到的,所以在循环中迭代器是不知道集合发生改变。所以会产生并发修改异常。如果要改其中的元素,要么用for循环来遍历集合,然后进行修改。要么用迭代器对象来修改。迭代器使用ListIterator。可以实现迭代过程中的增删改查等动作

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马