Hvad er der galt?

Tags:    java

Hej. Jeg har en klasse der hedder Club og en anden klasse der hedder Membership. I klassen Club har jeg en field var. members (ArrayList<Membership>;) der bevarer medlemmerne.

Problemet opstår når jeg i proceduren purge (i klassen Club) vil returnere en (anden) liste (outsiders) med medlemmer i en given måned (parameteren month), samtidig med at jeg fjerner disse medlemmer i members. Min ide er at løse problemet som vist i min method "purge", men der sker af en eller anden grund en fejl, som jeg ikke forstår:

"java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Club.purge(Club.java:47)"

Når jeg bruger debuggeren kører den igennem lykken første gang, men så hopper den bare ud.

getMonth returnerer den måned (int) som medlemmet joinede i.



public ArrayList<Membership> purge(int month){

ArrayList<Membership> outsiders;
outsiders= new ArrayList<Membership>();

for(Membership member : members){
if(member.getMonth() == month) {

outsiders.add(member);
members.remove(member);

}

}
return outsiders;
}

Hvem kan se fejlen?



3 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Jeg tror at problemet er at du retter (remove) i den liste du bruger til dit loop.

Hvis du vil undgå at lave en masse manuelt, så kunne du evt. også lave en ekstra ArrayList<Membership> insiders; og tilføje en else på din if hvor du siger insiders.add(member); , fjerner members.remove(member); og sætter members til insiders i linien inden return outsiders;

Selv er jeg oldschool Java udvikler som har stået lidt stille i nogle år, så jeg har aldrig den slags problemer, jeg kan bare resette mit loop index :)
[Læs: Jeg bruger ikke alt det fancy pancy noget man kan i dag]



Det er fordi du laver koden members.remove(member);

ArrayList ser cirka sådan her ud:
Fold kodeboks ind/udKode 

Disse to koder gør/er er de samme:
Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 


checkForComodification() bliver kaldt af next().

checkForComodification() tjekker om antallet af rows er det samme som man startede med/forventede. Hvis det ikke er det kaster den en ConcurrentModificationException.

Håber det var til at forstå. Ellers spørg:)



Tak for jeres svar Jonatan og Mathias!

Jeg kan se i koderne, at der er nogle (for mig) nye begreber, som jeg mener at have set (nogle af) længere fremme i den javabog, jeg er i gang med (bladre, bladre, skimte, skimte). Jeg derfor ikke helt tryg med ovenstående koder, så det kan være jeg spørger dig i stedet en anden gang, Mathias ;)

Jeg fik det dog til at virke, skal det siges. Mathias sagde nemlig problemet bestod i "members.remove(member);" (og tak for det!), for jeg fik i stedet omskrevet min method til

public ArrayList<Membership> purge1(int month){

ArrayList<Membership> outsiders;
outsiders= new ArrayList<Membership>();

for(Membership member : members){
if(member.getMonth() == month) {

outsiders.add(member);

}

}

for(Membership member : outsiders){

members.remove(member);

}

return outsiders;
}

OG det virker. Jeg tror, jeg må vente lidt med at forstå, hvorfor min første løsning ikke virker.

Tak til jer igen - det er alle tiders, I gider hjælpe!



t