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

它不会引发异常ConcurrentModificationException [重复]

董良策
2023-03-14
问题内容

我有以下代码,我希望它抛出ConcurrentModificationException,但运行成功。为什么会这样?

public void fun(){
    List <Integer>lis = new ArrayList<Integer>();
    lis.add(1);
    lis.add(2);

    for(Integer st:lis){
        lis.remove(1);
        System.out.println(lis.size());
    }
}

public static void main(String[] args) {
    test t = new test();
    t.fun();
}

问题答案:

remove(int)上方法List删除指定位置的元素。在开始循环之前,您的列表如下所示:

[1, 2]

然后,在列表上启动迭代器:

[1, 2]
 ^

您的for环然后删除 位置1处的元件 ,这是数字2:

[1]
 ^

在下一个隐式hasNext()调用上,迭代器返回false,然后循环终止。

ConcurrentModificationException如果将更多元素添加到列表中,则会得到一个。然后隐式next()将抛出。

请注意,从Javadoc ArrayList到JCF:

注意,迭代器的快速失败行为无法得到保证,因为通常来说,在存在不同步的并发修改的情况下,不可能做出任何严格的保证。快速失败的迭代器会ConcurrentModificationException尽力而为。因此,编写依赖于此异常的程序以确保其正确性是错误的:
迭代器的快速失败行为应仅用于检测错误

这实际上可能是Oracle ArrayList迭代器实现中的一个错误。hasNext()没有 检查修改:

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


 类似资料:
  • 问题内容: 我有一个方法test(),其中我试图将两个LinkedHashMap相互比较,并通过删除键/值对(如果在两个LHM中都找到)来修改其中一个映射的内容。运行此方法时,我不断收到ConcurrentModificationException。我知道为什么会收到异常(因为我正在尝试修改正在循环的列表)。我不确定如何进行此操作。到目前为止,我有以下代码: 问题答案: 您可以使用迭代器:

  • 问题内容: 我在接口抛出异常的地方读了这段代码,但是实现它的类却没有抛出异常或捕获异常,这是为什么呢?在Java中合法或安全吗? 问题答案: 实现和扩展的一般规则是,您可以使新类或接口的限制较少,而不能限制较多。如果您认为将异常作为限制进行处理的要求,则未声明异常的实现的限制性较小。对该接口进行编码的任何人都不会遇到您的课的麻烦。 -斯坦·詹姆斯 作为http://www.coderanch.co

  • 问题内容: 我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间 我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。 当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子

  • 问题内容: 我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们

  • 我正在使用Jackson2.2注释@JSONProperty,其中required设置为true。在通过ObjectMapper readValue()方法反序列化不包含该属性的json文件时,不会引发异常。它应该以不同的方式工作还是我错过了什么? 我希望这样做,因为在json文件中没有指定_name,并且需要抛出异常。

  • 我正在使用SQLServer,并且我有一个实体“注册”,其中包含student(student),作为ManyToOne关系。我尝试将student列名设置为“user”,这是一个SQL保留的关键字。 我还设置了,它将删除并创建表。 注意:我知道保留的SQL关键字可以用[USER]或“USER”转义。 当我执行测试主代码时,我确实从EclipseLink获得了一个DatabaseException