Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khi nào IllegalStateException (unchecked) được ném trong Java?

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ới offer() 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.