IllegalStateException là unchecked exception (ngoại lệ không kiểm tra) trong Java. Ngoại lệ này thường xảy ra khi làm việc với framework collection của java.util.package. Nhiều collection như List, Queue, Tree, Map – trong đó List và Queues (Queue và Deque) ném IllegalStateException ở điều kiện đặc định.
Khi nào IllegalStateException được ném
- Khi gọi một phương thức cụ thể ở thời điểm không thích hợp.
- Với java.util.List, dùng next() của ListIterator để duyệt. Nếu gọi remove() của ListIterator trước khi gọi next(), ngoại lệ này ném ra vì để List ở trạng thái không ổn định.
- Để sửa đổi đối tượng, dùng set() của ListIterator.
- Với queues, nếu cố thêm phần tử vào Queue đã đầy (bounded queue), sẽ ném IllegalStateException.
Ví dụ minh họa
import java.util.*;
public class IllegalStateExceptionTest {
public static void main(String args[]) {
List list = new LinkedList();
list.add("Welcome");
list.add("to");
list.add("Tutorials");
list.add("Point");
ListIterator lIterator = list.listIterator();
lIterator.next();
lIterator.remove(); // sửa đổi list
lIterator.set("Tutorix"); // LỖI: set() sau remove() không có next() trước đó
System.out.println(list);
}
}
Kết quả đầu ra
Exception in thread "main" java.lang.IllegalStateException
at java.util.LinkedList$ListItr.set(LinkedList.java:937)
at IllegalStateExceptionTest.main(IllegalStateExceptionTest.java:15)
Giải thích
Sau remove(), con trỏ iterator ở trạng thái không xác định cho set(). Cần gọi next() hoặc previous() trước khi dùng set().
Các tình huống thường gặp khác
ArrayBlockingQueue.add()khi queue đầy (ném IllegalStateException), khác vớioffer()trả về false.Iterator.remove()gọi hai lần liên tiếp mà không cónext()ở giữa.- Thao tác trên collection sau khi đã đóng stream hoặc tài nguyên liên quan.