[ConcurrentModificationException] Arraylist et Timer
Salut tous,
j'ai droit à :
Code:
1 2 3 4
|
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)
at java.util.AbstractList$Itr.next(AbstractList.java:419) |
quand je parcourt un ArrayList depuis un timer :( ...
La question est donc : existe t'il un type de liste qui supporte le parcourt en parallèle par plusieurs processus ? ou un moyen de parcourir un Arraylist qui ne lèverait pas cette exception ?
Merci
Question subsidiaire : mais pourquoi diantre n'y a t'il pas une méthode setValue(int value) dans la classe Integer ??? 8O 8O 8O
Re: [ConcurrentModificationException] Arraylist et Timer
Salut,
Citation:
Envoyé par lebesnec
La question est donc : existe t'il un type de liste qui supporte le parcourt en parallèle par plusieurs processus ? ou un moyen de parcourir un Arraylist qui ne lèverait pas cette exception ?
Le problème ne vient pas du parcours mais de modification de la liste pendant le parcours...
Cela peut survenir si tu utilises la List dans différents threads, et dans ce cas il faut utiliser une liste synchronisé :
Code:
List list = Collections.synchronizedList(new ArrayList());
Attention toutefois car l'utilisation des iterator il faut utiliser un bloc synchronized de la manière suivante :
Code:
1 2 3 4 5 6
| synchronized(list) {
Iterator i = list.iterator();
while (i.hasNext()) {
i.next();
}
} |
Le même principe existe pour les autres type de collections, et la classe Collections comporte un grand nombre de méthode utile ;)
Citation:
Envoyé par lebesnec
Question subsidiaire : mais pourquoi diantre n'y a t'il pas une méthode setValue(int value) dans la classe Integer ??? 8O 8O 8O
C'est une des philosophies de Java : l'utilisation de classes immuables...
Une classe immuable est une classe qui ne change jamais de "valeur". Cela permet de simplifier un peu la gestion des objets.
Cela permet d'éviter les constructeurs par copie lorsqu'on passe un objet en paramètre, où la définition de méthode "const" et l'utilisation de référence lorsqu'on passe un objet à une méthode...
a++
Dans le même ordre d'idée
Bonjour,
Tout d'abord, bonne année!!!
J'ai bien lu les pistes données dans les réponses à lebesnec, mais j'avoue ne pas y voir plus clair. J'ai moi aussi cette fameuse ConcurrentModificationException alors que je croyais m'en sortir avec des listes synchronisées dans une méthode JUnit.
Si vous avez des pistes, je suis preneur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| private List<P053Projection> retournerListeBeansFusionnes(List<P053Projection> liste1ToutesValeurs)
{
List<P053Projection> liste2 = Collections.synchronizedList(new ArrayList<P053Projection>());
synchronized (liste2)
{
for (P053Projection P053Projection : liste1ToutesValeurs)
{
if (P053Projection.getCOuB().compareTo("C") == 0)
{
liste2.add(P053Projection);
}
else
{
if (liste2.size() != 0)
{
Iterator iter = liste2.iterator();
while (iter.hasNext())
{
P053Projection P053Projection2 = (P053Projection) iter.next();
if (P053Projection.getCodi().compareTo(P053Projection2.getCodi()) == 0
&& P053Projection.getCodeA().compareTo(P053Projection2.getCodeA()) == 0
&& P053Projection.getCodeOpe().compareTo(P053Projection2.getCodeOpe()) == 0)
{
P053Projection2.setCOuB(" ");
Integer nbOperationsCumule = P053Projection.getNbOperations() + P053Projection2.getNbOperations();
BigDecimal montantsCumule = P053Projection.getCumulMontants().add(P053Projection2.getCumulMontants());
P053Projection2.setNbOperations(nbOperationsCumule);
P053Projection2.setCumulMontants(montantsCumule);
liste2.add(P053Projection2);
}
else
{
liste2.add(P053Projection);
}
}
}
}
}
}
return liste2;
} |
D'avance, merci pour vos pistes.
Thomas