Почему возникает IllegalStateException при удалении элементов из листа

Как избавиться от IllegalStateException в коде:

import java.util.ArrayList;
import java.util.Iterator;

public class Iterator1 {
    public static void main(String[] args) {
        ArrayList<String> al1 = new ArrayList<>();
        al1.add("Sasha");
        al1.add("Raul");
        al1.add("Mary");
        al1.add("Sasha");
        al1.add("Elena");

        Iterator<String> iterator1 = al1.iterator();
        while(iterator1.hasNext()) {
//            System.out.println(iterator1.next());//выовд с помощю iterator'а
            iterator1.remove();
            iterator1.next();
        }
        System.out.println(al1.toString());
    }
}

Ответы (2 шт):

Автор решения: kio

Поменяйте местами remove() и next(). next() возвращает элемент, который потом удаляется remove(), а у вас наоборот, поэтому и ошибка.

Iterator<String> iterator1 = al1.iterator();
while(iterator1.hasNext()) {
    iterator1.next();
    iterator1.remove();
}
→ Ссылка
Автор решения: Roman C

IllegalStateException возникает по причине неправильного удаления элемента листа. Чтобы избавиться от этой ошибки следует избавиться от итератора и воспользоваться уже готовым методом removeAll.

public class RemoveAllExample {
    public static void main(String[] args) {
      try { 
        ArrayList<String> al1 = new ArrayList<>();
        al1.add("Sasha");
        al1.add("Raul");
        al1.add("Mary");
        al1.add("Sasha");
        al1.add("Elena");

            // печать al1 
            System.out.println("ArrayList перед "
                               + "removeAll() операцией : "                               + al1); 

            // Создадим другой лист  ArrayList<String> 
            ArrayList<String> al2 = new ArrayList<>(al1);   

            // печать al2 
            System.out.println("Элементы коллекции"                               + " которые будут удалены : "                               + al2); 

            // Удалить элементы из al1 
            // находящиеся в al2 
            // используя метод removeAll()  
            al1.removeAll(al2); 

            // печать al1 
            System.out.println("ArrayList после "
                               + "removeAll() операции : "                               + al1);              
      } catch (NullPointerException e) {  
        System.out.println("Ошибка : " + e); 
      } 
   }
}

Заметим, что в коде используется try-catch блок, потому, что может возникнуть NullPointerException если этот список содержит нулевой элемент, а указанная коллекция не допускает нулевых элементов (необязательно) или если указанная коллекция имеет значение null.

→ Ссылка