java中的增强for循环使用的迷惑求解

lvyilong316 2012-11-29 09:44:47

public void sayhello()
{
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(2);
list.add(3);
list.add(2);
for(int a:list)
{
list.remove(2);
}

}

运行报错 求解
...全文
527 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
叫不醒的梦 2012-12-04
  • 打赏
  • 举报
回复
你的for(int a:list) { list.remove(2); } 就存在很严重的问题,你要永远记住!对于foreach来说只能是遍历比如查询等等,如果用想要是数组或者集合的元素增加或者减少时,使用foreach就是错误的。另一方面来说如果你想该方法来移除“2”,一定会抛出越界异常,你把所有的“2”都移除后,而for循环还在运行你说她不会抛出异常吗。
骚还是公骚骚 2012-12-03
  • 打赏
  • 举报
回复
你的程序怎么看怎么有问题
lgwinym 2012-12-03
  • 打赏
  • 举报
回复
倒着删除就没有问题了
rorom 2012-11-30
  • 打赏
  • 举报
回复
对,这个跟for无关的,是逻辑问题
zxl141421 2012-11-30
  • 打赏
  • 举报
回复
关于详细的解释可以参考:http://blog.csdn.net/smcwwh/article/details/7036663 解决办法可以如下:

public class Hello {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		Collections.addAll(list, "a,b,c,d,e,f".split(","));

		for (String string : list) {
			if (string.equals("d")) {
				list.remove(string);
				break;
			}
		}

		for (int i = 0; i < list.size(); i++) {
			String string = list.get(i);
			if (string.equals("b")) {
				list.remove(string);
			}
		}
	}
}
兆帅 2012-11-30
  • 打赏
  • 举报
回复
引用 10 楼 bree06 的回复:
Java code??123for (int a : list) { list.remove(2);} 这个写法本身就是有问题的。 ①、如果想要保持你的操作而不报错请加上这样一个判断 for (int a : list) { if (a == 2) list.remove(2); } ②、list.remove(2);会将2当数组下标也就是说会删……
++
bree06 2012-11-30
  • 打赏
  • 举报
回复
for (int a : list) {
    list.remove(2);
}
这个写法本身就是有问题的。 ①、如果想要保持你的操作而不报错请加上这样一个判断 for (int a : list) { if (a == 2) list.remove(2); } ②、list.remove(2);会将2当数组下标也就是说会删除list的第三个元素,而你的list本身只有3个元素,所以for执行到二次的时候就会抛出IndexOutOfBoundException。要删除元属请使用list.remove(new Integer(2)); ③、如果要达到预期的效果也就是删除list中所有的2可以使用 while (list.contains(new Integer(2))) { list.remove(new Integer(2)); }
asdf544265772 2012-11-30
  • 打赏
  • 举报
回复
引用 7 楼 huntor 的回复:
使用Iterator的remove方法。
学习,测试一下去。。。
悲催的程序猿 2012-11-30
  • 打赏
  • 举报
回复
lvyilong316 2012-11-30
  • 打赏
  • 举报
回复
public void sayhello() { ArrayList<Integer> list=new ArrayList<Integer>(); list.add(2); list.add(3); list.add(2); for(int a=0;a<list.size();a++) { if(list.get(a)==3) list.remove(a); } for(int a=0;a<list.size();a++) { System.out.println(list.get(a)); } } 用普通的for就没问题
jumpheightway 2012-11-30
  • 打赏
  • 举报
回复
你难道不知道这是线程不安全的吗
huntor 2012-11-30
  • 打赏
  • 举报
回复
使用Iterator的remove方法。
「已注销」 2012-11-30
  • 打赏
  • 举报
回复
list里面只能放引用数据类型吧
oFengZhongZhiZhu 2012-11-29
  • 打赏
  • 举报
回复
haode CSDN官方微信正式上线
lvyilong316 2012-11-29
  • 打赏
  • 举报
回复
引用 1 楼 suciver 的回复:
这不是for循环的问题,是ArrayList的问题 ArrayList是线程不安全的,你边遍历又删除自然报出并发异常(快速失败异常) 很多人会出这样的错误。楼主对集合的特性要了解透彻
请问那要怎么解决这个问题啊?
zhaoming262350 2012-11-29
  • 打赏
  • 举报
回复
这不是增强for()的问题,你这种写法就是for()循环,
BaronZ 2012-11-29
  • 打赏
  • 举报
回复
百度ListIterator,这个List特有的Iterator,可以一边遍历一边删除或者增加
suciver 2012-11-29
  • 打赏
  • 举报
回复
这不是for循环的问题,是ArrayList的问题 ArrayList是线程不安全的,你边遍历又删除自然报出并发异常(快速失败异常) 很多人会出这样的错误。楼主对集合的特性要了解透彻

62,614

社区成员

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

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