Junior — Middle
Τι σημαίνει η εμφάνιση της εξαίρεσης ConcurrentModificationException στη Java και σε ποιες καταστάσεις μπορεί να ριχτεί;
sobes.tech AI
Απάντηση από AI
Η εξαίρεση ConcurrentModificationException στη Java συμβαίνει όταν, κατά τη διάρκεια επανάληψης σε μια συλλογή, πραγματοποιείται μια δομική αλλαγή σε αυτήν (π.χ. προσθήκη ή διαγραφή στοιχείων) όχι μέσω του επαναληπτή, αλλά απευθείας μέσω των μεθόδων της συλλογής. Αυτός ο μηχανισμός fail-fast προειδοποιεί για πιθανώς επικίνδυνες αλλαγές που θα μπορούσαν να οδηγήσουν σε λανθασμένη λειτουργία του επαναληπτή.
Τυπικές καταστάσεις όπου ρίχνεται αυτή η εξαίρεση:
- Επανάληψη σε
ArrayListμεIterator, και μέσα στον βρόχο καλείταιlist.remove()απευθείας, αντί γιαiterator.remove(). - Τροποποίηση της συλλογής από άλλο νήμα κατά τη διάρκεια της επανάληψης χωρίς συγχρονισμό.
Παράδειγμα:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
if (s.equals("b")) {
list.remove(s); // θα ρίξει `ConcurrentModificationException`
}
}
Ο σωστός τρόπος διαγραφής κατά τη διάρκεια της επανάληψης:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("b")) {
iterator.remove(); // ασφαλές
}
}