Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么迭代器或listIterator的hasnext、hasprevious等方法不检查ConcurrentModificationException_Java_Collections - Fatal编程技术网

Java 为什么迭代器或listIterator的hasnext、hasprevious等方法不检查ConcurrentModificationException

Java 为什么迭代器或listIterator的hasnext、hasprevious等方法不检查ConcurrentModificationException,java,collections,Java,Collections,我知道failfast迭代器会尽最大努力检查ConcurrentModificationException。为什么像hasnext或hasPrevious这样的方法不检查ConcurrentModificationException并抛出它 以下代码运行良好,其确切原因是,尽管已对其结构进行了修改,但这些方法未针对CME进行检查 public static void main(String[] args) { // TODO Auto-generated method stub

我知道failfast迭代器会尽最大努力检查ConcurrentModificationException。为什么像hasnext或hasPrevious这样的方法不检查ConcurrentModificationException并抛出它

以下代码运行良好,其确切原因是,尽管已对其结构进行了修改,但这些方法未针对CME进行检查

public static void main(String[] args) {
        // TODO Auto-generated method stub


        List<String> lilong = new ArrayList<String>();
        lilong.add("Queen");
        for(Iterator<String> iter =lilong.iterator();iter.hasNext();)
        {
            System.out.println(iter.next());
            lilong.add("King");
            lilong.remove(0);
            lilong.add("Star");
            lilong.remove(0);
            lilong.add("Sun");
            lilong.remove(0);
            lilong.add("Polar Bear");
            lilong.clear();

            lilong.add("There you go");

        }
        System.out.println("size="+ lilong.size()+"##element##"+lilong.iterator().next());
    }
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
List lilong=new ArrayList();
加上(“女王”);
for(迭代器iter=lilong.Iterator();iter.hasNext();)
{
System.out.println(iter.next());
添加(“国王”);
移除(0);
添加(“星”);
移除(0);
加上(“太阳”);
移除(0);
加上(“北极熊”);
李龙;
lilong.add(“就是这样”);
}
System.out.println(“size=“+lilong.size()+”#####“+lilong.iterator().next());
}
编辑:删除一堆垃圾

所以问题是:为什么不像迭代器的其他方法那样,
hasNext()
检查并发修改


如果我敢打赌,
hasNext()
没有多大用处,除非后面有一个
next()
。因此,它不是在两个位置进行检查,而是在
next()

hasNext
中,因为ArrayList的迭代器不检查修改,它只查看大小

如果您在列表中再添加一个元素,您将进入第二次迭代,然后
next
将按预期失败


至于为什么会这样实施+1回答您的问题。

我在这里没有看到任何迭代器。迭代器隐藏在for each语句中。@Kayaman我的意思是。for each循环由编译器内部推断为迭代器,for(字符串s:lilong)使用lilong.iterator()转换为代码。是的。。这就是重点。如果检查hasNext()方法的concurrentmodification异常,它肯定也适用于这种情况。迭代器只检查next()和remove()@AbhinavKumar的CME。我不确定您的代码实际要显示什么。即使hasNext()检查了CME,示例代码仍会像现在一样运行。我需要替换迭代器构造的代码,只有这样我才清楚他们会这样做,但hasNext()绕过了此检查。因此我想知道CME怎么会不会不会是caughtArrayList的javadoc说的“仅仅设置元素的值不是结构修改。”,因此list.set(0,“foo”)不会导致CME。哦,等等,这是讨论外部修改的部分,所以它可能仍然会导致CME。不,只是尝试了一下。set(index,obj)方法不会导致CME。是的,但它可以使用next()使用的此方法进行检查和remove()方法:-final void checkForComodification(){if(modCount!=expectedModCount)抛出新的ConcurrentModificationException();}这是从remove()和next()方法调用的,但不是从hasnext()方法调用的“yes,但它可以检查”。True。但它不是。