remove in for

krgewb

Top Contributor
Ist das erlaubt oder schreit es nach Exception?

Java:
for (Map.Entry<String, Long> entry : mappingUuidAndTsOfHeartbeat.entrySet()) {
    String uuid = entry.getKey();
    Long tsOfHeartbeat = entry.getValue();
    long diffInMilliseconds = now - tsOfHeartbeat;
    if (diffInMilliseconds > ttl) {
        mappingUuidAndTsOfHeartbeat.remove(uuid);
    }
}
 

Robert Zenz

Top Contributor
Mein erster Instinkt war dass eine Exception geworfen wird, tatsaechlich ist das Ergebnis aber undefiniert. Java 8 Map.entrySet():

Returns a Set view of the mappings contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation, or through the setValue operation on a map entry returned by the iterator) the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.

Hervorhebung von mir.
 

httpdigest

Top Contributor
Hat weniger mit "sauber" zu tun, als vielmehr mit "dass es überhaupt erstmal funktionieren sollte".
Also, seine Lösung ist ja nicht "unsauber", sondern einfach komplett falsch bzw. würde nicht funktionieren.
"Unsaber" wäre für mich: "Es funktioniert zwar, erfüllt also die Anforderungen, ist aber im Sinne der Wartbarkeit und des Verständnisses schlecht"
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Es tritt eine Exception auf. Die ApiDoc ist an der Stelle ungenau, weil das nicht erwähnt wird. ... Das kommt wiederum dir zugute, weil du deine Antwort nach besten Wissen geschrieben hast, also nicht bewusst Unsinn verbreiten wolltest.
Auch wenn es vermutlich wenig Sinn macht, das hier im Detail zu vertiefen:
Es gibt klare Anforderungen, was bei einer Implementation von Java (Compiler, JVM, Framework) erfüllt sein muss und es gibt diesbezüglich sehr umfangreiche Tests von Oracle, die dies überprüfen.

Wenn ein Verhalten nun nicht definiert wurde, dann ist das Ergebnis schlicht undefiniert. Eine Implementation könnte eine Exception werden und eine andere könnte ohne Exception auskommen. Und ich habe keinen Zugriff auf diese Testsuite, daher kann ich nicht nachsehen, ob/was hier getestet wird. Aber die Dokumentation stimmt in der Regel sehr genau überein und die Aussage sollte daher mit der Testsuite überein stimmen.

Die Chance ist aber sehr hoch, dass alle üblichen Implementationen hier eine ConcurrentModificationException werfen werden.
 

httpdigest

Top Contributor
Hier ist es aber ein bisschen Grauzone, weil es nicht direkt einen Übersetzungsfehler gibt, sondern erst später zur Laufzeit.
Naja, das ist keine Grauzone. Nicht jeder Fehler in einem Programm ist immer gleich ein Übersetzungs-/Compilerfehler. Nur die, die eben nicht der Grammatik oder Typisierung der Sprache entsprechen, können hier gefunden werden. Alles andere (und ich würde fast sagen, "das meiste" - z.B. NPEs) ist erst ein Fehler zur Laufzeit.
Und einige Sprachen haben ja noch nicht mal einen Übersetzungsschritt (JavaScript, Python, ...). Würdest du dort sagen, dass man mit solchen Sprachen gar keine Fehler produzieren kann?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
D remove arraylist by id not work Java Basics - Anfänger-Themen 6
H Collections JTree remove zeigt keinen Effekt! Java Basics - Anfänger-Themen 8
B Sorting List und Remove Java Basics - Anfänger-Themen 2
P Map - remove() ? Java Basics - Anfänger-Themen 46
Hacer remove at index Java Basics - Anfänger-Themen 31
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
S Vererbung remove elment from Array Java Basics - Anfänger-Themen 0
J easy remove method Java Basics - Anfänger-Themen 1
K Methoden Probleme mit LinkedList.remove(object) Java Basics - Anfänger-Themen 1
U PriorityQueue remove Java Basics - Anfänger-Themen 2
M ArrayList - remove() löscht nicht! - weiß nicht wieso! Java Basics - Anfänger-Themen 8
B map.remove(long) Java Basics - Anfänger-Themen 5
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
B LinkedList remove Java Basics - Anfänger-Themen 5
I Liste Remove erstes Element Java Basics - Anfänger-Themen 5
D Wie Iterator Remove implementieren? Java Basics - Anfänger-Themen 11
W Treemap remove Java Basics - Anfänger-Themen 5
H Remove Methode von List Java Basics - Anfänger-Themen 6
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
C Datentypen ArrayList.remove(index) hinterlässt leeres Feld Java Basics - Anfänger-Themen 5
H TreeMap.remove(value) - und nicht mit key! Geht das? Java Basics - Anfänger-Themen 18
S OOP ArrayList Klasse nachbauen, prob mit remove Java Basics - Anfänger-Themen 5
U ArrayList.remove(i) funktioniert nicht Java Basics - Anfänger-Themen 9
J Remove from an AraayList Java Basics - Anfänger-Themen 8
J Iterator remove()? Java Basics - Anfänger-Themen 5
T ArrayList#remove Java Basics - Anfänger-Themen 8
M ArrayList remove Element? Java Basics - Anfänger-Themen 3
B HashMap remove Java Basics - Anfänger-Themen 2
J TreeSet methode Remove Java Basics - Anfänger-Themen 13
C Add / Remove Panel Java Basics - Anfänger-Themen 2
J remove Problem Java Basics - Anfänger-Themen 8
M remove()-Methode eines Iterators Java Basics - Anfänger-Themen 3
megachucky remove bei Vector klappt nicht Java Basics - Anfänger-Themen 11
M Problem mit Iterator.remove() Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben