开发者社区> 问答> 正文

原理分析,简述在java语言中,增强for循环,是如何触发fail-fast机制的

原理分析,简述在java语言中,增强for循环,是如何触发fail-fast机制的

展开
收起
huc_逆天 2021-01-11 10:24:54 807 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    增强for 循环这个语法糖进行解糖

    public static void main(String[] args) {
        // 使用ImmutableList 初始化一个List
        List<String> userNames = new ArrayList<String>() {{
        add("Hollis");
        add("hollis");
        add("HollisChuang");
        add("H");
        }};
        Iterator iterator = userNames.iterator();
        do
        {
        if(!iterator.hasNext())
        break;
        String userName = (String)iterator.next();
        if(userName.equals("Hollis"))
        userNames.remove(userName);
        } while(true);
        System.out.println(userNames);
    }
    

    异常发生,Iterator.next 调用了 Iterator.checkForComodification 方法 ,而异常就 是checkForComodification 方法中抛出的。

    checkForComodification 方法的代码,看下抛出异常的原因:

    final void checkForComodification() {
        if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }
    

    代码比较简单,modCount != expectedModCount 的时候, 就会抛出ConcurrentModificationException。

    之所以会抛出ConcurrentModificationException 异常,是因 为我们的代码中使用了增强for 循环,而在增强for 循环中,集合遍历是通过iterator 进行的,但是元素的add/remove 却是直接使用的集合类自己的方法。这就导致 iterator 在遍历的时候,会发现有一个元素在自己不知不觉的情况下就被删除/ 添加 了,就会抛出一个异常,用来提示用户,可能发生了并发修改

    2021-01-11 10:25:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载