黑马程序员技术交流社区

标题: 为什么运行后会抛异常 [打印本页]

作者: yangyinhui    时间: 2013-4-4 13:57
标题: 为什么运行后会抛异常
本帖最后由 yangyinhui 于 2013-4-4 17:34 编辑

在用增强for循环删除集合中的元素为什么会抛异常

作者: 黑马伍哲沂    时间: 2013-4-4 14:21
因为增强for循环不能在遍历集合的时候动态的对集合进行增删改查操作。

i增强for循环本身是内部调用了iterator。   iterator不能对集合进行增改查操作,

虽然有一个删除用的(可选)remove方法,但是remove的使用也是有前提的,

remove删除的是最后一个next方法所返回的对象,所以调用remove方法之前必须先调用next();

总之,增强for循环只能获取元素,不能动态操作集合,也不能获取下标。
作者: 杜加璇    时间: 2013-4-4 14:52
接口Iterator定义了增强for循环,增强for循环只能获取集合元素,不能改变集合结构就是不能增删集合元素。
作者: 王川    时间: 2013-4-4 15:24
因为增强的for循环内部就是调用iterator实现的,在遍历的时候就将list转化为了迭代器,当迭代器被创建之后,如果从结构上对列表修改除非通过迭代器自身的remove、add方法,其他任何时间任何方式的修改,迭代器都会抛出ConcurrentModificationException异常。
作者: 刘策    时间: 2013-4-4 15:28
for只能对集合中的元素进行遍历不能进行增删的动作,使用iterator中可以的。
作者: 袁杰    时间: 2013-4-4 17:08
因为在在增强for循环的循环体里,相当于是在桟空间中重新定义了一个引用型的变量,指向集合中元素对应的在堆内存中的实体变量,在这个增强for中的操作对循环体外面的集合本身是没有丝毫影响的,又容易造成理解代码时的困难,所以Java提供了一种机制,可以在编译期间就把这样的操作封杀。具体的方法,是在循环变量类型前面加上一个“final”修饰符。这样一来,在循环体里对循环变量进行赋值,就会导致一个编译错误。
作者: yangyinhui    时间: 2013-4-4 17:34
明白了。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2