java自学教程|www.konglongmei.com

作者: 123456790
查看: 95|回复: 0

more +社区更新Forums

more +随机图赏Gallery

[技术知识] 为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remov

[技术知识] 为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remov

[复制链接]
123456790 | 显示全部楼层 发表于: 2019-12-3 02:16:09
123456790 发表于: 2019-12-3 02:16:09 | 显示全部楼层 |阅读模式
查看: 95|回复: 0
在阅读《阿里巴巴Java开发手册》时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下:

错误演示

我们首先在 IDEA 中编写一个在 foreach 循环里进行 remove 操作的代码:
  1. import java.util.ArrayList;import java.util.List;public class ForEachTest {    public static void main(String[] args) {        List list = new ArrayList();        list.add("wupx");        list.add("love");        list.add("huxy");        for (String temp : list) {            if ("love".equals(temp)) {                list.remove(temp);            }        }        System.out.println(list);    }}
复制代码
此时执行代码,编译正确,执行成功!输出 [wupx, huxy]。
接着我们把 “love” 换成 “wupx” 或是 “huxy” 再来运行下,执行结果如下:

纳尼,居然报错了,为什么第一次运行没有报错呢?让我们一起来进行探讨吧!
追根溯源

为了研究为什么会出现这样的情况,我们可以根据异常堆栈信息,去追踪错误,其中涉及到的部分源码如下:
[code]private class Itr implements Iterator {    int cursor;       // 下一个要返回的元素的索引    int lastRet = -1; // 返回的最后一个元素的索引(如果没有返回-1)    int expectedModCount = modCount;    public boolean hasNext() {        return cursor != size;    }        public void remove() {        if (lastRet < 0)            throw new IllegalStateException();        checkForComodification();        try {            ArrayList.this.remove(lastRet);            cursor = lastRet;            lastRet = -1;            expectedModCount = modCount;        } catch (IndexOutOfBoundsException ex) {            throw new ConcurrentModificationException();        }    }    @Override    @SuppressWarnings("unchecked")    public void forEachRemaining(Consumer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|网站地图|java自学教程|www.konglongmei.com

GMT+8, 2020-7-6 20:37 , Processed in 0.360970 second(s), 47 queries .

快速回复 返回顶部 返回列表