Sobes.tech
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(); // ασφαλές
    }
}