Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

IllegalStateException (Unchecked) โยนเมื่อไหร่ใน Java?

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
}