IllegalStateException เป็น Unchecked Exception ใน Java เกิดขึ้นมักเมื่อใช้ Collection Framework (java.util) โดยเฉพาะ List และ Queue/Deque
เมื่อไหร่ที่ IllegalStateException ถูกโยน
- เรียกเมธอดใน เวลาที่ไม่เหมาะสม (inappropriate time)
- ListIterator: เรียก remove() ก่อน next() → List อยู่ในสถานะไม่เสถียร
- ListIterator: เรียก set() โดยไม่ได้เรียก next()/previous() ก่อน
- Queue: พยายาม add element ลง Queue ที่เต็มแล้ว (ถ้าเป็น bounded queue)
ตัวอย่างโค้ดที่ทำให้เกิด Exception
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(); // ลบ "Welcome" - OK
lIterator.set("Tutorix"); // ERROR! set() ต้องมี next()/previous() ก่อนหน้า
System.out.println(list);
}
}
ผลลัพธ์ (Exception)
Exception in thread "main" java.lang.IllegalStateException
at java.util.LinkedList$ListItr.set(LinkedList.java:937)
at IllegalStateExceptionTest.main(IllegalStateExceptionTest.java:15)
วิธีแก้ไข
- เรียก next() หรือ previous() ก่อน set() หรือ remove()
- ตรวจสอบ hasNext()/hasPrevious() ก่อน iterate
- สำหรับ Queue ใช้ offer() แทน add() (คืน false แทน exception) หรือเช็ค remainingCapacity()
โค้ดที่ถูกต้อง
ListIterator it = list.listIterator();
if (it.hasNext()) {
it.next(); // ต้องมี next() ก่อน
it.set("New Value"); // OK
}