ทั้ง ClassNotFoundException และ NoClassDefFoundError เป็นข้อผิดพลาดเมื่อ JVM หรือ ClassLoader ไม่พบคลาสที่เหมาะสมขณะโหลดขณะทำงาน ClassNotFoundException เป็นข้อยกเว้นที่ตรวจสอบแล้วและ NoClassDefFoundError คือ Error ที่ไม่ถูกตรวจสอบ
ClassLoader . มีหลายประเภท โหลดคลาสจากแหล่งต่าง ๆ บางครั้งอาจทำให้ไฟล์ไลบรารี JAR หายไปหรือคลาสพา ธ ไม่ถูกต้องซึ่งทำให้ตัวโหลดไม่สามารถโหลดคลาสได้ในขณะใช้งาน
ClassNotFoundException
ClassNotFoundException เกิดขึ้นเมื่อเราพยายามโหลดคลาสขณะรันไทม์โดยใช้ Reflection และหากไฟล์คลาสเหล่านั้นหายไป แอปพลิเคชันหรือโปรแกรมจะส่งด้วย ClassNotFoundException ข้อยกเว้น ไม่มีอะไรต้องตรวจสอบตอนคอมไพล์เพราะมันกำลังโหลดคลาสตอนรันไทม์
ตัวอย่าง
public class ClassNotFoundExceptionTest { public static void main(String[] args) { try { Class.forName("Test"); } catch (ClassNotFoundException cnfe) { System.err.println("You are trying to search for a class is not existing. "+cnfe); } } }
ผลลัพธ์
You are trying to search for a class is not existing. java.lang.ClassNotFoundException: Test
NoClassDefFoundError
NoClassDefFoundError ถูกส่งออกไปเมื่อคลาสได้รับการคอมไพล์ด้วยคลาสเฉพาะจาก classpath แต่ถ้าคลาสเดียวกันไม่มีให้ใช้งานระหว่างรันไทม์ ไฟล์ JAR ที่หายไปเป็นสาเหตุพื้นฐานที่สุดในการรับ NoClassDefFoundError . ตามเอกสาร Java API "คำจำกัดความของคลาสที่ค้นหามีอยู่เมื่อมีการคอมไพล์คลาสที่ดำเนินการอยู่ในปัจจุบัน แต่ไม่พบคำจำกัดความอีกต่อไป"
ตัวอย่าง
class Test1 { public void show() { System.out.println("show() method called"); } } public class Test2 { public static void main(String[] args) { Test1 t = new Test1(); t.show(); } }
เมื่อเราคอมไพล์ทั้งสองคลาส เราจะได้รับไฟล์คลาสสองไฟล์ Test1.class และ Test2.class ขณะใช้งาน Test2 คลาสเพียงแค่ลบ Test1.class ไฟล์แล้วเราจะได้ NoClassDefFoundError ดังต่อไปนี้
ผลลัพธ์
Exception in thread "main" java.lang.NoClassDefFoundError: Test1 at Test2.main(Test2.java:9)