Main 메서드 내에서 for 루프를 입력하는 코드가 있습니다.java.util.ConcurrentModificationException의 원인을 찾을 수 없습니다.
for (List<Point2D> points : output) {
currentPath = pathDistance(points);
if (shortest == 0){
shortest = currentPath;
} else if (currentPath < shortest) {
best = points;
shortest = currentPath;
}
}
pathDistance
이
public static Double pathDistance(List<Point2D> path){
double distance = 0;
int count = path.size()-1;
for (int i = 0; i < count; i++) {
distance = distance + path.get(i).distance(path.get(i+1));
}
distance = distance + path.get(0).distance(path.get(count));
return distance;
}
으로 정의된다
하지만 오류
가 계속Exception in thread "main" java.util.ConcurrentModificationException
at java.util.SubList.checkForComodification(Unknown Source)
at java.util.SubList.size(Unknown Source)
at java.util.Collections$SynchronizedCollection.size(Unknown Source)
at TSMain.pathDistance(TSMain.java:76)
at TSMain.main(TSMain.java:203)
나는 이것이 반복에 의존하는 동안 객체를 변경하고 있음을 뜻 알고 하지만 그 삶은 어디에서 일어날 지 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.
당신은 '출력'을 변경하고 있지만, 반드시이 'for' 루프에있는 것은 아닙니다. 이것은 또 다른 코드의 다른 쓰레드에 의해 행해질 수도 있지만,'output' 객체와 완전히 똑같은 참조를 가지고 있습니다. – Tom
개선 된 for 루프를 각 반복에서 크기를 계산하는 전통적인 방법으로 대체하십시오. 목록을 전혀 수정하지 않고 (요소를 제거하거나 요소를 추가하는 경우) 향상된 for 루프에서 문제가 발생합니다. –
'Collections.synchronizedCollection'에 의해 싸여진 sublist를 전달하는 것처럼 보입니다. 그러나 원래 목록은 반복되는 동안 수정됩니다. – vsminkov