Goede morgen,
Ik zit met een lastig probleem bij ons java project. In een klasse van containables heb ik volgende methode om een containable te "termineren". (Een containable is een soort rugzak, handtas, ... alles waar je iets in kan stoppen).
De fout gebeurt nadat super.terminate() is opgeroepen (waar niets gevaarlijks gebeurt, juist 2 velden die worden aangepast).
Containables bevatten een HashMap<Long,HashSet<Item>>, een hashmap met als key een identificatieNr en als value een hashset. (Dit komt omdat we moeten werken met semi unieke id's voor Items en een methode die controleert of er een Item met een bepaald id in zit moet in constante tijd werken).
1 de 1e methode wordt er dus gelooped over alle keys, en voor elke key worden alle bijhorende Items getermineerd. De methode getItemsOfIdentification(identification) doet hetzelfde als items.get(identification), het retourneerd de value bij een bepaalde id, een HashSet dus.
Elk Item in getItemsOfIdentification(identification) wordt getermineerd via de methode terminate (niets speciaals, wat wel van belang kan zijn is dat het item van de lijst wordt losgekoppeld).
Alles goed en wel, maar het wil niet werken... Ik krijg een ConcurrentModificationException. Deze exception wil zeggen dat je niet over een lijst kan loopen als een andere methode de lijst aan het aanpassen is.
Ik zie niet echt in waarom ik deze Exception krijg: pas na dat de methode terminateItemsOfIdentification(id) is voltooid, ga je toch pas naar de volgende ID?
Ik heb nog al eens gelooped over een lijsten in een lijst, maar deze Exception meen ik mij daar niet bij te herrineren.
Iemand die een idee heeft waar dat het fout loopt?
Bij voorbaat dank
Ik zit met een lastig probleem bij ons java project. In een klasse van containables heb ik volgende methode om een containable te "termineren". (Een containable is een soort rugzak, handtas, ... alles waar je iets in kan stoppen).
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| @Override public void terminate() { super.terminate(); for (Long id : items.keySet()) { terminateItemsOfIdentification(id); } } private void terminateItemsOfIdentification(long identification) throws IllegalArgumentException{ if(!items.containsKey(identification)) throw new IllegalArgumentException(); for (Item item : getItemsOfIdentification(identification)) { item.terminate(); } } |
De fout gebeurt nadat super.terminate() is opgeroepen (waar niets gevaarlijks gebeurt, juist 2 velden die worden aangepast).
Containables bevatten een HashMap<Long,HashSet<Item>>, een hashmap met als key een identificatieNr en als value een hashset. (Dit komt omdat we moeten werken met semi unieke id's voor Items en een methode die controleert of er een Item met een bepaald id in zit moet in constante tijd werken).
1 de 1e methode wordt er dus gelooped over alle keys, en voor elke key worden alle bijhorende Items getermineerd. De methode getItemsOfIdentification(identification) doet hetzelfde als items.get(identification), het retourneerd de value bij een bepaalde id, een HashSet dus.
Elk Item in getItemsOfIdentification(identification) wordt getermineerd via de methode terminate (niets speciaals, wat wel van belang kan zijn is dat het item van de lijst wordt losgekoppeld).
Alles goed en wel, maar het wil niet werken... Ik krijg een ConcurrentModificationException. Deze exception wil zeggen dat je niet over een lijst kan loopen als een andere methode de lijst aan het aanpassen is.
Ik zie niet echt in waarom ik deze Exception krijg: pas na dat de methode terminateItemsOfIdentification(id) is voltooid, ga je toch pas naar de volgende ID?
Ik heb nog al eens gelooped over een lijsten in een lijst, maar deze Exception meen ik mij daar niet bij te herrineren.
Iemand die een idee heeft waar dat het fout loopt?
Bij voorbaat dank