我知道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)
答案 0 :(得分:1)
一旦你做了
x = list.subList(fromIndex, toIndex);
不应修改列表,否则在访问x
时会抛出CME来自.subList javadocs:
如果是,则此方法返回的列表的语义将变为未定义 支持列表(即,该列表)以任何方式在结构上被修改 除了通过返回的列表。 (结构修改是那些 这会改变这个列表的大小,或以其他方式扰乱它 方式,正在进行的迭代可能会产生不正确的结果。)