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

ClassNotFoundException และ NoClassDefFoundError ใน Java แตกต่างกันอย่างไร


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