ทั้ง 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)