当前位置: 首页 > 面试题库 >

为什么会收到ConcurrentModificationException?

霍建柏
2023-03-14
问题内容

为什么在代码的指定位置出现ConcurrentModificationException?我无法弄清楚自己在做什么错…
removeMin()正在使用该方法在列表中找到分钟pq,将其删除并返回其值

import java.util.Iterator;
import java.util.LinkedList;

public class test1 {

    static LinkedList<Integer> list = new LinkedList<Integer>();

    public static void main(String[] args) {
        list.add(10);
        list.add(4);
        list.add(12);
        list.add(3);
        list.add(7);

        System.out.println(removeMin());
    }

    public static Integer removeMin() {
        LinkedList<Integer> pq = new LinkedList<Integer>();
        Iterator<Integer> itPQ = pq.iterator();

        // Put contents of list into pq
        for (int i = 0; i < list.size(); i++) {
            pq.add(list.removeFirst());
        }

        int min = Integer.MAX_VALUE;
        int pos = 0;
        int remPos = 0;

        while (itPQ.hasNext()) {
            Integer element = itPQ.next(); // I get ConcurrentModificationException here
            if (element < min) {
                min = element;
                remPos = pos;
            }
            pos++;
        }

        pq.remove(remPos);
        return remPos;
    }

}

问题答案:

一旦修改了从其获得的Collection,则不应认为Iterator可用。(对于java.util.concurrent。*集合类,放宽了此限制。)

您首先要获得一个Iterator pq,然后进行修改pq。修改之后pq,Iterator
itPQ不再有效,因此当您尝试使用它时,您会收到ConcurrentModificationException。

一种解决方案是Iterator<Integer> itPQ = pq.iterator();while循环之前向右移动。更好的方法是完全不使用Iterator:

for (Integer element : pq) {

从技术上讲,for-each循环在内部使用Iterator,因此无论哪种方式,此循环仅在您不尝试pq在循环内进行修改时才有效。



 类似资料:
  • 问题内容: 我在代码的第34行上不断收到LineUnavailableException:https://www.refheap.com/21223 错误显示为。 我正在创建Sound类的多个实例(在我的refheap粘贴中实现)。似乎最初的实例没有问题。但是,当我开始使用相同的音频文件制作Sound对象的新实例时,便开始出现此错误。 知道如何解决吗? EIDT:我认为这个问题的 想法可能是我需要

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl

  • 问题内容: 我正在使用Java编写的Cocos2D在Android中制作2D游戏。这是我的主要代码: 如您所见,此函数看起来很好,canExecuteMovement中的矩形也很好,但是在此行中: 我收到一个InvocationTargetException。这是logcat: 可能是什么问题呢?Guy中的getBounds()类是这样的: 问题答案: 只是动态调用中引发的异常的包装。真正的问题是

  • 问题内容: 我在服务器上运行批处理作业时遇到问题,而在开发工作站上的Eclipse上运行良好。 我已经使用Roo设置了Spring环境,创建了一个实体,并进行了一些工作,并在我的develompent盒上对其进行了良好的测试。我初始化上下文并完成工作,但是当我在服务器上运行批处理时,上下文未正确初始化。这是代码: 这是日志和异常: 关于发生了什么任何想法或提示吗?我的类路径设置为$ PROJECT

  • 问题内容: 我在android虚拟机中使用以下代码 我收到HttpHostConnectException。不知道为什么?我已将网址中的地址从127.0.0.1更改为10.0.2.2,但仍然收到该异常。我的电脑中安装了wamp服务器,文件“ ReadingFromServer.php”位于“ www”文件夹中。 这是完整的堆栈跟踪 谢谢。 问题答案: 您是否在AndroidManifest.xml

  • 问题内容: 在下面获得了以下生产代码,我正在将其用于新驱动程序。portName是COM4,并且该端口存在于PC上(并且我可以通过超级终端连接到该端口),那么Javacomm为什么会抛出NoSuchPortException?COM4在设备mgr中显示正常。太 问题答案: 尝试使用枚举系统上可用端口的列表,并打印列出的内容。您确定在正确的文件夹中安装了jarfiles和dll吗?如果是,则尝试使用