ConcurrentModificationException的可能原因

时间:2014-12-03 02:21:56

标签: java concurrentmodification

我知道ConcurrentModificationException是什么。之前我曾经拥有它们,之前我解决了它们,我可以使用Iterator。 但是,在这种情况下,我不明白为什么会被抛出。

public boolean pointOnEdgeBlob(int x, int y, float edgeHitEpsilon) {

    init();

    for (int i = 0; i < nOfBlobs; i++) {
        Blob b = blobs.get(i);
         // >>>>>>>>>>>>>>>>>>>>> here it calls the method where it goes wrong
        if (b.edgeHit(x, y, edgeHitEpsilon)) return true; 
    }
    return false;
}

这是blob中的edgeHit方法:

public boolean edgeHit(float x, float y, float edgeHitEpsilon) {


    // quick test if it's worth it
    if (x < getMinX()-edgeHitEpsilon || x > getMaxX()+edgeHitEpsilon || y < getMinY()-edgeHitEpsilon || y > getMaxY()+edgeHitEpsilon) {
        return false;
    }

    // the last one should be connected to the first
    // >>>>>>>>>>>>>>> if i comment the part in the for loop then this get's the problem.
    PVector pre = cornerVectors.get(cornerVectors.size() -1);
    PVector cur;

    for (int i = 0; i < cornerVectors.size(); i++) {
        // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> on this line it throws
        cur = cornerVectors.get(i); 

        if(Blob.onLine(pre, cur, x, y, edgeHitEpsilon)) {
            return true;
        }

        pre = cur;

    }

    return false;

}

更新

cornerVectors是一个列表视图:

 List<PVector> cornerVectors;

它设置为:

list.subList(fromIndex, toIndex);

没有其他威胁在运行。

这是堆栈跟踪:

  

线程“动画线程”中的异常   java.util.ConcurrentModificationException at   java.util.SubList.checkForComodification(AbstractList.java:752)at   java.util.SubList.size(AbstractList.java:625)at   新闻报道:   nl.doekewartena.contour.scanner.BlobData.pointOnEdgeBlob(BlobData.java:333)     在   nl.doekewartena.contour.scanner.ContourFinder.scan(ContourFinder.java:555)     在   nl.doekewartena.contour.scanner.ContourFinder.scan(ContourFinder.java:469)     在exclude.T04_ContourFinder.draw(T04_ContourFinder.java:38)at   processing.core.PApplet.handleDraw(PApplet.java:2386)at   processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:240)     在processing.core.PApplet.run(PApplet.java:2256)at   java.lang.Thread.run(Thread.java:695)

1 个答案:

答案 0 :(得分:1)

一旦你做了

x = list.subList(fromIndex, toIndex);

不应修改列表,否则在访问x

时会抛出CME

来自.subList javadocs:

  

如果是,则此方法返回的列表的语义将变为未定义   支持列表(即,该列表)以任何方式在结构上被修改   除了通过返回的列表。 (结构修改是那些   这会改变这个列表的大小,或以其他方式扰乱它   方式,正在进行的迭代可能会产生不正确的结果。)