gpt4 book ai didi

java - Fast-fail - 异常仅在添加元素时发生,而不是在删除时发生

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:00 25 4
gpt4 key购买 nike

Fast-Fail :意味着如果他们检测到自迭代开始以来集合已经改变,他们抛出未经检查的ConcurrentModificationException

我写了一个测试例子来证明这一点:

    String hi = "Hi";
list.add(hi);
list.add("Buy");
System.out.println("list before: " + list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
list.add("Good");
}

输出是:

list before: [Hi, Buy]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at thread.CollectionTest.main(CollectionTest.java:19)

这是预期的。然而,当一个元素被移除时,不会抛出异常:

    List<String> list = new ArrayList<>();

String hi = "Hi";
list.add(hi);
list.add("Buy");
System.out.println("list before: " + list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
list.remove(hi);
}

输出:

list before: [Hi, Buy]
list after: [Buy]

这是为什么呢?在这两种情况下,列表都已修改。

最佳答案

重点是检查修改的不是hasNext(),而是next()。在您的“删除”场景中,您抑制了将抛出的 next 调用,因为没有下一个元素。

如果一开始有 3 个元素,删除一个元素会导致 hasNext 为“true”。然后下面的 next 将抛出预期的异常。

JavaDoc 指出“快速失败”功能基于“最大努力”工作,它应该仅用于检测错误,而不是真正依赖它来使程序正确运行。显然是因为像这样的副作用。

关于java - Fast-fail - 异常仅在添加元素时发生,而不是在删除时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33390649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com