Java java.util.ConcurrentModificationException erreur
svp quelqu'un peut-il m'aider à résoudre ce dernier problème tant de jours, je ne pouvais pas en mesure de résoudre cette erreur. J'ai essayé à l'aide de méthode synchronisée et d'autres moyens, mais n'a pas de travail, donc s'il vous plaît aider moi
Erreur
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at JCA.startAnalysis(JCA.java:103)
at PrgMain2.doPost(PrgMain2.java:235)
Code
public synchronized void startAnalysis() {
//set Starting centroid positions - Start of Step 1
setInitialCentroids();
Iterator<DataPoint> n = mDataPoints.iterator();
//assign DataPoint to clusters
loop1:
while (true) {
for (Cluster c : clusters)
{
c.addDataPoint(n.next());
if (!n.hasNext())
break loop1;
}
}
//calculate E for all the clusters
calcSWCSS();
//recalculate Cluster centroids - Start of Step 2
for (Cluster c : clusters) {
c.getCentroid().calcCentroid();
}
//recalculate E for all the clusters
calcSWCSS();
//List copy = new ArrayList(originalList);
//synchronized (c) {
for (int i = 0; i < miter; i++) {
//enter the loop for cluster 1
for (Cluster c : clusters) {
for (Iterator<DataPoint> k = c.getDataPoints().iterator(); k.hasNext(); ) {
// synchronized (k) {
DataPoint dp = k.next();
System.out.println("Value of DP" +dp);
//pick the first element of the first cluster
//get the current Euclidean distance
double tempEuDt = dp.getCurrentEuDt();
Cluster tempCluster = null;
boolean matchFoundFlag = false;
//call testEuclidean distance for all clusters
for (Cluster d : clusters) {
//if testEuclidean < currentEuclidean then
if (tempEuDt > dp.testEuclideanDistance(d.getCentroid())) {
tempEuDt = dp.testEuclideanDistance(d.getCentroid());
tempCluster = d;
matchFoundFlag = true;
}
//if statement - Check whether the Last EuDt is > Present EuDt
}
//for variable 'd' - Looping between different Clusters for matching a Data Point.
//add DataPoint to the cluster and calcSWCSS
if (matchFoundFlag) {
tempCluster.addDataPoint(dp);
//k.notify();
// if(k.hasNext())
k.remove();
for (Cluster d : clusters) {
d.getCentroid().calcCentroid();
}
//for variable 'd' - Recalculating centroids for all Clusters
calcSWCSS();
}
//if statement - A Data Point is eligible for transfer between Clusters.
//}//syn
}
//for variable 'k' - Looping through all Data Points of the current Cluster.
}//for variable 'c' - Looping through all the Clusters.
}//for variable 'i' - Number of iterations.
//syn
}
Est-ce un code multithread? Ce qui est avec tous les
Je soupçonne que le problème est causé par
synchronized
? Existe-il d'autres threads qui modifient les collections que vous avez à parcourir? (c'est à dire clusters
et c.getDataPoints()
?).Je soupçonne que le problème est causé par
tempCluster.addDataPoint(dp);
, quand tempCluster == c
itérée par k
.
OriginalL'auteur vijay | 2010-04-26
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas modifier une liste alors que vous êtes itération, à moins que vous le faire par le biais de la
Iterator
.À partir de l'API:
ConcurrentModificationException
Votre code est un gâchis, il est donc difficile de comprendre ce qui se passe, mais je voudrais vérifier pour:
remove
ETadd
OriginalL'auteur polygenelubricants
Je pense que simplement à la recherche de la javadoc pour
ConcurrentModificationException
aurait répondu à votre question. Avez-vous essayer?Iterator.remove()
est à l'origine de l'exception, probablement sur la linkek.remove()
. Cela signifie que vous avez modifié leList
c'est une itération en itération, ce qui n'est pas autorisé. Si vous avez besoin de comprendre oùc.getDataPoints()
est en train de changer. Je devine que c'est parce que vous finirez par trouver un clusterd
, de lui attribuertempCluster
, puis changer ses points de données (qui est finalement la liste, vous êtes à parcourir.L'OP doit être plus poli. Beaucoup de gens dans stackoverflow sont l'apprentissage, certains littéralement ne sait même pas ce qu'est une javadoc.
Je crois qu'il est juste de supposer une recherche sur internet comme un standard minimum ici, et qui conduirait à la javadoc. Je suis en désaccord que c'était impoli de le suggérer. Encourager ce niveau de la question des moyens, il est plus difficile pour les bonnes questions pour obtenir de l'attention, et ne fait rien pour encourager la personne à investir plus d'effort, qui est la vraie source de l'apprentissage.
OriginalL'auteur Sean Owen
si vous avez besoin de supprimer quelques éléments de votre liste. Vous pouvez maintenir une liste des éléments à être supprimé. Et enfin appeler removeAll(collection). Bien sûr, ce n'est pas bon pour les grandes quantités de données.
OriginalL'auteur iftee
Garder quelques choses à l'esprit pour éviter les accès concurrents questions :
Tout d'abord la méthode (startAnalysis) est une méthode d'instance. Donc la synchronisation sera spécifique à son instance. Ainsi, vous devez vous assurer que tous les threads tentent d'accéder à cette méthode doit utiliser la même instance pour éviter les accès concurrents questions. Si chaque thread est en se référant à une autre instance, puis tous les threads de l'exécution de la méthode et peut éventuellement conduire à des problèmes de concurrence.
Deuxièmement, on doit toujours préférer utiliser un Itérateur plutôt le pour:chaque boucle pour parcourir les collections, pour éviter les accès concurrents et/ou de modification des questions.
Vous pouvez également utiliser la collecte simultanée de l'api classes pour éviter des problèmes de concurrence. Ces classes sont largement utilisés dans de telles exigences pour éviter les modifications simultanées des questions.
Espère que cette aide.
OriginalL'auteur Ankur Shanbhag