ข้อผิดพลาดและข้อยกเว้น

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Jim White

Java Developer

Exception กับ Error

  • Error คือปัญหาร้ายแรงที่แอปพลิเคชันรับมือไม่ได้
    • Error ทำให้แอปพลิเคชัน "crash" หรือหยุดทำงาน
    • ตัวอย่าง: ปัญหาหน่วยความจำเต็มถือเป็น Error ใน Java
  • แอปพลิเคชันสามารถรับมือและกู้คืนจาก Exception ได้
    • การเข้าถึงองค์ประกอบนอกขอบเขตอาร์เรย์ถือเป็น Exception
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java
ตัวอย่าง Error
import java.util.*;

public class CauseOutOfMemory {
    public static void main(String[] args) {
        List<Long> numbers = new ArrayList<Long>();
        long counter = 0;
        while (true) {
            numbers.add(counter);
            counter++;
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.lang.Long.valueOf(Long.java:1204)
    at foo/exceptions.CauseOutOfMemory.main(CauseOutOfMemory.java:12)
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Exception 2 ประเภท

Checked Exception Runtime ("unchecked") Exception
ต้องจัดการ ใช่ ไม่
สาเหตุทั่วไป สิ่งที่อยู่นอกเหนือการควบคุม ความผิดพลาดในการเขียนโค้ด
การกู้คืน กู้คืนได้หากคาดการณ์ไว้ มักกู้คืนไม่ได้
กลไกการกู้คืน try/catch หรือ throws ควรเขียนโค้ดให้รอบคอบเพื่อหลีกเลี่ยง
ตัวอย่าง Exception ไม่พบไฟล์ ดัชนีอาร์เรย์เกินขอบเขต
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Checked และ Runtime Exception

  • คลาสย่อยของ Exception ที่ไม่ใช่คลาสย่อยของ RuntimeException คือ checked exception
    • ต้องจัดการ (handle) เสมอ
    • ตัวอย่าง: ไม่พบไฟล์ (FileNotFoundException)
  • RuntimeException เป็น superclass ของ unchecked exception ทั้งหมด
    • ไม่จำเป็นต้องจัดการ
    • ตัวอย่าง: เข้าถึงดัชนีอาร์เรย์ที่ไม่มีอยู่ (IndexOutOfBoundsException)
    • ตัวอย่าง: หารด้วยศูนย์ (ArithmeticException)
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

RuntimeException

คลาสย่อยของ RuntimeException คำอธิบายเงื่อนไขที่เกิดขึ้น
ArithmeticException การคำนวณทางคณิตศาสตร์ที่ผิดพลาด เช่น หารด้วย 0
IndexOutOfBoundsException ดัชนีที่ใช้กับอาร์เรย์ String ฯลฯ อยู่นอกขอบเขต
NegativeArraySizeException พยายามสร้างอาร์เรย์ที่มีขนาดติดลบ
int y = 5/0; // ArithmeticException causing code
int[] list = new int[-1];  //NegativeArraySizeException causing code
Exception in thread "main" java.lang.ArithmeticException: / by zero
Exception in thread "main" java.lang.NegativeArraySizeException: -1
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/RuntimeException.html
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

"Checked" Exception

public class LoadClass {
    public static void main(String[] args) {
        Class myClass = Class.forName("com.mysql.Driver");
    }
}
LoadClass.java:3: error: unreported exception ClassNotFoundException; 
must be caught or declared to be thrown
                Class myClass = Class.forName("com.mysql.Driver");
                                             ^
1 error
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Exception.html
ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

มาฝึกกันเถอะ!

ชนิดข้อมูลและการจัดการข้อยกเว้นใน Java

Preparing Video For Download...