当前位置: 首页 > 知识库问答 >
问题:

未在预期时引发java.util.concurrentModificationException

曾飞雨
2023-03-14
   public void test(){
      ArrayList<String> myList = new ArrayList<String>();

      myList.add("String 1");
      myList.add("String 2");
      myList.add("String 3");
      myList.add("String 4");
      myList.add("String 5");

      for(String s : myList){
         if (s.equals("String 2")){
            myList.remove(s);
         }
      }
   }
   public void test(){
      ArrayList<String> myList = new ArrayList<String>();

      myList.add("String 1");
      myList.add("String 2");
      myList.add("String 3");

      for(String s : myList){
         if (s.equals("String 2")){
            myList.remove(s);
         }
      }
   }

不同的是,第一个列表包含5项,而第二个列表包含3项。使用的JVM是:

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

问题:为什么第二段代码不抛出java.util.concurrentModificationException?

共有1个答案

夏昌胤
2023-03-14

arraylist.iterator()返回的迭代器在实现中,我们显然只在调用next()时检查结构修改,而不是在调用hasnext()时检查结构修改。后者看起来如下所示(在Java8下):

public boolean hasNext() {
    return cursor != size;
}

所以在第二种情况下,迭代器“知道”它返回了两个元素,而列表只有两个元素...所以hasnext()只返回false,我们永远不会第三次调用next()

我认为这是一个实现细节--基本上检查不是那么严格。在这种情况下,hasnext()执行检查并抛出异常是完全合理的。

 类似资料:
  • java.lang.AssertionError:预期测试将在org.junit.Assert.Fail(Assert.java:88)在org.junit.rules.ExpectedException.FailduetOmissingException(ExpectedException.java:263)在org.junit.rules.ExpectedException.Access$20

  • 我相信我的问题有一个简单的理论答案,但我找不到。 ...我希望显示的错误消息是 ORA-20001value_error 但是,不幸的是,我得到了:

  • 有一个列表正在被两个线程同时排序和迭代。不出所料,它导致。不清楚的是错误的时间。 输出:(出现几次) 为什么当第一个线程完成时,另一个线程的迭代失败? 当两个线程分别完成排序并获得迭代器时,底层迭代器将不会改变。为什么在此阶段会导致异常?

  • 尝试部署Web应用程序时,我遇到以下错误: 错误-站点XXX的容器XXX\u 0未在预期的时间限制内启动。运行时间=1800.4463925秒 我试图部署一个节点应用程序。使用自动部署。部署文件。部署文件如下所示: package.json文件具有以下脚本: 和服务器。详情如下: 我从研究中得出的结论是: 没有足够的时间让app启动 端口未打开/启动时没有响应ping 为了解决(1)我把WEBSI

  • 我正在对我的一个服务进行Mockito单元测试,我试图模拟它,但无法返回所需的对象。我的代码片段如下所示: 现在,通过了测试用例,但是失败了,因为。 我很困惑,我不是刚刚模拟了返回一个的行为吗?我做了一些研究,发现了这篇文章:Mockito when/then not returning expected value,我想知道如何使用“doreturn()...when()”定义嘲笑行为,但仍然没

  • 这是我到目前为止用于此任务的代码: 但是如果我输入了一个无效的日期,比如,它将转换为,而不是抛出异常。