还是ConcurrentModificationException问题

锦瑟six 2014-09-09 09:05:48
想用Iterator遍历一个LinkedList,在使用完其中的一个元素后,就将它删除
import java.util.*;

public class Controller{
private List<Event> eventList = new LinkedList<Event>();
public void addEvent(Event c){eventList.add(c);}
public void run(){
List<Event> subList = new LinkedList<Event>();
Iterator<Event> it = eventList.iterator();
while(it.hasNext()){
Event x =it.next();
if(x.ready()){
System.out.println(x);
x.action();
subList.add(x);
}
}
eventList.removeAll(subList);
}
}
这里的subList和eventList指向的不是同一个引用啊,也没在遍历的时候删除元素,为什么还是抛出了ConcurrentModificationException???
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
锦瑟six 2014-09-11
  • 打赏
  • 举报
回复
引用 3 楼 sky_walker85 的回复:
public void run() {
		List<Event> subList = new LinkedList<Event>();
		Iterator<Event> it = eventList.iterator();
		while (it.hasNext()) {
			Event x = it.next();
			if (x.ready()) {
				System.out.println(x);
				//x.action();
				subList.add(x);
				System.out.println(subList);
			}
		}
		
		eventList.removeAll(subList);
	}
楼主将x.action()注释掉,可以正确运行。出现这个错误的原因是执行x.action()改变了x,这样就会导致it.next()抛出异常
确实是,x.action()执行后,gc.addEvent(gc.new Bell(900));修改了eventList,往里面加了对象。 谢谢!何时才能达到你的水平
skyWalker_ONLY 2014-09-10
  • 打赏
  • 举报
回复
public void run() {
		List<Event> subList = new LinkedList<Event>();
		Iterator<Event> it = eventList.iterator();
		while (it.hasNext()) {
			Event x = it.next();
			if (x.ready()) {
				System.out.println(x);
				//x.action();
				subList.add(x);
				System.out.println(subList);
			}
		}
		
		eventList.removeAll(subList);
	}
楼主将x.action()注释掉,可以正确运行。出现这个错误的原因是执行x.action()改变了x,这样就会导致it.next()抛出异常
锦瑟six 2014-09-09
  • 打赏
  • 举报
回复
锦瑟six 2014-09-09
  • 打赏
  • 举报
回复
所有源代码: public abstract class Event{ private long eventTime; protected final long delayTime; public Event(long delayTime){ this.delayTime = delayTime; start(); } public void start(){ eventTime = System.nanoTime() + delayTime; } public boolean ready(){ return System.nanoTime() >= eventTime; } public abstract void action(); } import java.util.*; public class Controller{ private List<Event> eventList = new LinkedList<Event>(); public void addEvent(Event c){eventList.add(c);} public void run(){ List<Event> subList = new LinkedList<Event>(); Iterator<Event> it = eventList.iterator(); while(it.hasNext()){ Event x =it.next(); if(x.ready()){ System.out.println(x); x.action(); subList.add(x); } } eventList.removeAll(subList); } } public class GreenHouseControls extends Controller{ private boolean light = false; public class LightOn extends Event{ public LightOn(long delayTime){super(delayTime);} public void action(){ light = true; } public String toString(){return "Light is on";} } public class LightOff extends Event{ public LightOff(long delayTime){super(delayTime);} public void action(){ light = false; } public String toString(){return "Light is off";} } private boolean water = false; public class WaterOn extends Event{ public WaterOn(long delayTime){super(delayTime);} public void action(){ water = true; } public String toString(){return "Greenhouse water is on";} } public class WaterOff extends Event{ public WaterOff(long delayTime){super(delayTime);} public void action(){ water = false; } public String toString(){return "Greenhouse water is off";} } private boolean fan = false; public class FanOn extends Event{ public FanOn(long delayTime){super(delayTime);} public void action(){ fan = true; } public String toString(){return "Fan is on";} } public class FanOff extends Event{ public FanOff(long delayTime){super(delayTime);} public void action(){ fan = false; } public String toString(){return "Fan is off";} } private String thermostat = "Day"; public class ThermostatNight extends Event{ public ThermostatNight(long delayTime){super(delayTime);} public void action(){ thermostat = "Night"; } public String toString(){return "Thermostat on night setting";} } public class ThermostatDay extends Event{ public ThermostatDay(long delayTime){super(delayTime);} public void action(){ thermostat = "Day"; } public String toString(){return "Thermostat on day setting";} } public class Bell extends Event{ public Bell(long delayTime){super(delayTime);} public void action(){ addEvent(new Bell(delayTime)); } public String toString(){return "Bing!";} } public class Restart extends Event{ private Event[] eventList; public Restart(long delayTime, Event[] eventList){ super(delayTime); this.eventList = eventList; for(Event e : eventList) addEvent(e); } public void action(){ for(Event e : eventList){ e.start(); addEvent(e); } start(); addEvent(this); } public String toString(){return "Restarting system";} } public static class Terminate extends Event{ public Terminate(long delayTime){super(delayTime);} public void action(){System.exit(0);} public String toString(){return "Terminating";} } } public class GreenHouseController{ public static void main(String[] args){ GreenHouseControls gc = new GreenHouseControls(); gc.addEvent(gc.new Bell(900)); Event[] eventList = { gc.new ThermostatNight(0), gc.new LightOn(200), gc.new LightOff(400), gc.new WaterOn(600), gc.new WaterOn(800), gc.new FanOn(1000), gc.new FanOff(800), gc.new ThermostatDay(1400) }; gc.addEvent(gc.new Restart(2000, eventList)); if(args.length == 1) gc.addEvent(new GreenHouseControls.Terminate(new Integer(args[0]))); gc.run(); } }

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧