java自学教程|www.konglongmei.com

作者: David902
查看: 13|回复: 0

more +社区更新Forums

more +随机图赏Gallery

疯狂Java讲义(第4版) PDF 电子书 百度云 网盘下载疯狂Java讲义(第4版) PDF 电子书 百度云 网盘下载
价值825元 牛客算法通关课程视频教程 第六期 百度云 网盘下载价值825元 牛客算法通关课程视频教程 第六期 百度云 网盘下载
Spring 5核心原理与30个类手写实战 PDF 电子书 百度云 网盘下载Spring 5核心原理与30个类手写实战 PDF 电子书 百度云 网盘下载
Spring 5核心原理与30个类手写实战+Spring Boot编程思想核心篇pdfSpring 5核心原理与30个类手写实战+Spring Boot编程思想核心篇pdf
Spring Boot编程思想核心篇+Spring 5核心原理与30个类手写实战pdfSpring Boot编程思想核心篇+Spring 5核心原理与30个类手写实战pdf
java电子书]微服务架构设计模式 PDF 电子书 百度云 网盘下载java电子书]微服务架构设计模式 PDF 电子书 百度云 网盘下载

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

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

[复制链接]
David902 | 显示全部楼层 发表于: 7 天前
David902 发表于: 7 天前 | 显示全部楼层 |阅读模式
查看: 13|回复: 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, 2019-12-10 10:04 , Processed in 0.139922 second(s), 47 queries .

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