Ich habe Grundkenntnisse in Java und arbeiten derzeit auf einem Java-basierten Code.Iterieren über sortierte Treemap: java.util.ConcurrentModificationException
EDIT: Ich habe nicht schreiben den Code
ich über eine sortierte treemap von Event
Objekte und bekommen diese Ausnahme bin Iterieren, wenn ich das nächste Element zu bekommen versuche:
java.util.ConcurrentModificationException at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source) at java.util.TreeMap$KeyIterator.next(Unknown Source)
Ich denke, dies sollte auf das Vorhandensein von mehreren Einträgen mit demselben Wert zurückzuführen sein, die durch den Iteratorkomparator zusammengeführt werden (beziehe sich auf diese question, aber ich weiß nicht, wie man die im Komparator verwendeten Schlüssel findet. Das Objekt Event
hat viele Parameter (wie ID, Zeit usw.), aber nicht sicher, welcher für den Iterator verwendet wird. Hier
ist der entsprechende Codeabschnitt (Ausnahme im zweiten SimEvent first = fit.next();
):
if (future.size() > 0) {
List<SimEvent> toRemove = new ArrayList<SimEvent>();
Iterator<SimEvent> fit = future.iterator();
queue_empty = false;
SimEvent first = fit.next();
processEvent(first);
future.remove(first);
fit = future.iterator();
// Check if next events are at same time...
boolean trymore = fit.hasNext();
while (trymore) {
SimEvent next = fit.next();
if (next.eventTime() == first.eventTime()) {
processEvent(next);
toRemove.add(next);
trymore = fit.hasNext();
} else {
trymore = false;
}
}
future.removeAll(toRemove);
} else {...}
EDIT: Die Halle Code von future
Klasse:
public class FutureQueue {
/** The sorted set. */
private final SortedSet<SimEvent> sortedSet = new TreeSet<SimEvent>();
/** The serial. */
private long serial = 0;
/**
* Add a new event to the queue. Adding a new event to the queue preserves the temporal order of
* the events in the queue.
*
* @param newEvent The event to be put in the queue.
*/
public void addEvent(SimEvent newEvent) {
newEvent.setSerial(serial++);
sortedSet.add(newEvent);
}
/**
* Add a new event to the head of the queue.
*
* @param newEvent The event to be put in the queue.
*/
public void addEventFirst(SimEvent newEvent) {
newEvent.setSerial(0);
sortedSet.add(newEvent);
}
/**
* Returns an iterator to the queue.
*
* @return the iterator
*/
public Iterator<SimEvent> iterator() {
return sortedSet.iterator();
}
/**
* Returns the size of this event queue.
*
* @return the size
*/
public int size() {
return sortedSet.size();
}
/**
* Removes the event from the queue.
*
* @param event the event
* @return true, if successful
*/
public boolean remove(SimEvent event) {
return sortedSet.remove(event);
}
/**
* Removes all the events from the queue.
*
* @param events the events
* @return true, if successful
*/
public boolean removeAll(Collection<SimEvent> events) {
return sortedSet.removeAll(events);
}
public void clear() {
sortedSet.clear();
}
}
Jeder Vorschlag, wie man vorgehen debuggen Sie dieses Problem?
Würdest du bitte den Code der 'future' Klasse teilen? –
Warum verwenden Sie manchmal fit.next() ohne fit.hasNext() zu überprüfen? – user7294900
@VasiliyVlasov: in der Frage bearbeitet bearbeiten – Betty