为什么这段Java代码会触发ConcurrentModificationException?

2024-04-25

在循环的第一行中,我收到错误,但我不明白为什么。根据我的阅读,只有当我迭代一个集合并尝试同时修改它时,才会发生这种情况,但事实并非如此。

在代码中,list属于类型ArrayList<Product>.

void mergeSort() { 
    mergeSort(0, list.size() - 1); //128
}

private void mergeSort(int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        mergeSort(p, q); //133
        mergeSort(q + 1, r);
        merge(p, q, r); //135
    }
}

private void merge(int p, int q, int r) {
    List<Product> left = list.subList(p, q);
    left.add(Product.PLUS_INFINITE);
    List<Product> right = list.subList(q + 1, r);
    right.add(Product.PLUS_INFINITE);
    int i = 0;
    int j = 0;
    for (int k = p; k <= r; ++p) {
        Product x = left.get(i).compareTo(right.get(j)) <= 0 ? left.get(i++) : right.get(j++); //147
        list.set(k, x);
    }
}

这是堆栈跟踪:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1415)
    at java.base/java.util.ArrayList$SubList.get(ArrayList.java:1150)
    at ProductList$ProductSort.merge(MainClass.java:147)
    at ProductList$ProductSort.mergeSort(MainClass.java:135)
    at ProductList$ProductSort.mergeSort(MainClass.java:133)
    at ProductList$ProductSort.mergeSort(MainClass.java:128)
    at ProductList.sort(MainClass.java:95)
    at MainClass.main(MainClass.java:187)

subList不会创建与指定范围内的原始列表具有相同元素的新列表。相反,它创建了一个“视图”(docs https://docs.oracle.com/javase/8/docs/api/java/util/List.html#subList-int-int-):

返回此列表的一部分的视图 [...]。返回的列表受此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。

另请注意:

如果支持列表(即此列表)以除返回列表之外的任何方式进行结构修改,则此方法返回的列表的语义将变得不确定。

这正是你正在做的merge。您正在创建子列表left。然后修改left结构上与add。到目前为止,一切都很好。但后来你创建了另一个子列表right并修改it以及。这使得“语义left变得未定义”。这会导致下一次调用get抛出异常。

最小可重现示例:

ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3", "4"));
List<String> left = list.subList(0, 2);
List<String> right = list.subList(2, 4);
right.add("5");
left.get(0);

在这方面,子列表有点像迭代器(你只能remove通过迭代器,如果通过原始列表删除,可能会抛出 CME https://stackoverflow.com/questions/18448671/how-to-avoid-concurrentmodificationexception-while-removing-elements-from-arr).

解决此问题的一种简单方法是创建子列表的副本,以便它们不再是“视图”,而实际上是独立的列表:

List<Product> left = new ArrayList<>(list.subList(p,q));
List<Product> right = new ArrayList<>(list.subList(q+1,r));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这段Java代码会触发ConcurrentModificationException? 的相关文章

  • 为什么会出现此异常 FileItemStream$ItemSkippedException?

    在 gwt Web 应用程序中 我必须发送一个文件和附加的一些参数 在服务器端 try ServletFileUpload upload new ServletFileUpload FileItemIterator iterator upl
  • Maven 2:如何将当前项目版本打包在WAR文件中?

    我正在使用 Maven 2 构建我的 Java 项目 并且正在寻找一种向用户呈现 pom xml 当前版本号的方法 例如使用 Servlet 或 JSP 据我所知 最好的方法是 Maven 将版本号作为文本文件打包到 WAR 中 这使我能够
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • Jackson - 反序列化嵌套 JSON

    我有一个 JSON 字符串 其格式如下 response execution status ready report cache hit true created on 2013 07 29 08 42 42 fact cache erro
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 在哪里可以获得有关 Java FitNesse 和 Slim 的一些教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 是否有任何API可以将Microsoft Exchange服务器与Java应用程序集成以进行任务同步?

    我正在尝试将 Java Web 应用程序与 Microsoft Exchange 服务器集成以实现双向日历 即任务 同步 是否有用于此集成的 Java 开源 商业 API 谢谢 文卡特 看一眼j 交易所 http sourceforge n
  • 如何拦截 REST 端点以接收所有标头?

    我当前的代码是 Path login RequestScoped public class LoginResource GET SecurityChecked public Response getUser HeaderParam AUTH
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分

随机推荐

  • 视频文件中的感兴趣区域

    这是我第一次在这里发帖 希望能得到积极的结果 因为我的研究已接近尾声 我想在我的代码中添加一个函数 该函数将仅处理视频文件的定义的感兴趣区域 我无法发布图片 因为我还没有声誉 但这里发布了同样的问题 gt http answers open
  • OpenCV的calcOpticalFlowPyrLK抛出异常

    一段时间以来 我一直在尝试使用 OpenCV 构建一个小型光流示例 除了函数调用 calcOpticalFlowPyrLK 之外 一切正常 该函数在控制台窗口中打印以下失败的断言 OpenCV错误 断言失败 mytype typ0 CV M
  • 将文本单词换行

    我使用下面的代码来包装长文本 由用户在文本区域中输入以进行评论 function addNewlines comments var result while trim comments length gt 0 result comments
  • 拖动并 connectToSortable 到 iframe 内的可排序 DIV 中

    我试图将一个元素从主页拖动到其中的 iframe 并在框架内使用可排序的 div 我能够使 div 可排序 并将可拖动的内容连接到可排序的内容 但元素放置的位置计算错误并在错误的位置排序 可能是因为iframe内的鼠标坐标与主页的位置不同
  • 数据列表验证中 Obj.length>0 错误

    我有一个脚本 我通过 tempmankey 在网站上运行它 该脚本基本上是在输入字段中插入数据列表 并根据数据列表选择的值更改其他输入值 code function bdi contains Truck No closest div nex
  • 如何检测Vista UAC是否启用?

    我需要我的应用程序根据是否启用 Vista UAC 来表现不同 我的应用程序如何检测用户计算机上的 UAC 状态 该注册表项应该告诉您 HKLM SOFTWARE Microsoft Windows CurrentVersion Polic
  • 定制 iPhone 键盘

    我需要 即客户要求 提供自定义键盘 供用户在文本字段和区域中输入文本 我已经有一些可以执行键盘操作并将测试附加到文本字段的东西 但是我想让它更通用并让它像标准的 iphone 键盘一样工作 即当用户选择可编辑文本控件时出现 目前我的控制器知
  • 使用 BrokeredMessage 从 Azure 服务总线队列 (v1) 反序列化强类型对象

    无论出于何种原因 我似乎无法弄清楚如何将我的对象从队列中取出并将其反序列化回它放入其中的内容 An账户事件DTO Azure函数成功将对象放入队列 FunctionName AccountCreatedHook public static
  • 从groupby中的列获取模式[重复]

    这个问题在这里已经有答案了 我试图获取 groupby 对象中列的模式 但出现此错误 incompatible index of inserted column with frame index 这是我遇到的问题 我不知道如何解决它 任何帮
  • 哪个类应该存储查找表? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 世界上有不同地点的代理 但任何地点都只有一个代理 每个特工都知道他在哪里 但我还需要快速检查给定位置是否有特工 因此 我还维护了一张从位置到代理
  • 对角度数据表中括号内的数字进行排序

    我在用角度数据表 http l lin github io angular datatables 根据网络服务响应填充我的表 我的网络服务返回一个如下所示的 json id 1 name abc count 20 id 2 name abc
  • 计算和合并行

    我有一个表 通过将国家 地区代码添加到每行的 国家 地区代码 列来记录 Web 应用程序中的用户位置 每行代表对特定区域的访问 所以我有一些数据 比如 COL1 COL2 COL3 countrycode asd asd asd NZ as
  • 使用 Kafka Streams 在输出中设置时间戳无法进行转换

    假设我们有一个变压器 用 Scala 编写 new Transformer String V String V var context ProcessorContext override def init context Processor
  • 如何在弹性搜索(aws)中存储日期范围数据并搜索范围?

    我正在尝试在弹性搜索中存储酒店房间可用性 然后我需要 搜索从某个日期到另一个日期可用的房间 我想出了 存储数据以确保可用性的两种方式 如下 这里可用性字典存储了所有日期 每个日期键的值是 true 或 false 代表其可用 那天与否 id
  • R:有没有一种简单有效的方法来获取分块对角矩阵的构建分块矩阵列表?

    我正在寻找一个 内置 函数 它通过以下方式有效地返回块对角矩阵的构建块列表 而不是迭代插槽以手动获取列表 construct bdiag matrix library Matrix listElems lt list matrix 1 4
  • 生成 Java JNI 标头

    我想做的就是使用 JDK Javah exe 程序生成 JNI 头文件 但无论我尝试什么 我都会收到错误消息 错误 找不到 ddg ndkTest NativeLib 的类文件 其中 ddg ndkTest 是命名空间 NativeLib
  • AWS S3 StringLike条件阻止对存储桶的请求

    我有以下 s3 IAM 政策 它的目的是允许我从存储桶内的 temp prod tests 位置复制文件或将文件放入下面的存储桶中 在策略中 我添加了 StringLike 条件 我希望该条件允许策略中的权限允许在对象前缀包含时进行复制和放
  • 使用多个参数多次调用傀儡定义的资源

    我有一个简单的木偶定义的资源 如下所示 define mything number device otherthing file place number ensure gt directory mount place number dev
  • 使用vuex时如何在typescript语法中使用mapState函数?

    我在与 vuex 集成的 vuejs 项目中使用 typescript 语法 我想使用 ts 文件中计算的 mapState 方法 但出现语法错误 目前我正在使用文档建议的计算函数语法 我的意思是 get counter return th
  • 为什么这段Java代码会触发ConcurrentModificationException?

    在循环的第一行中 我收到错误 但我不明白为什么 根据我的阅读 只有当我迭代一个集合并尝试同时修改它时 才会发生这种情况 但事实并非如此 在代码中 list属于类型ArrayList