原理分析,简述在java语言中,增强for循环,是如何触发fail-fast机制的
增强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 在遍历的时候,会发现有一个元素在自己不知不觉的情况下就被删除/ 添加 了,就会抛出一个异常,用来提示用户,可能发生了并发修改
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。