Computer >> Máy Tính >  >> Lập trình >> Java

Sự khác biệt giữa ClassNotFoundException và NoClassDefFoundError trong Java là gì?

Cả ClassNotFoundException NoClassDefFoundError là lỗi khi JVM hoặc ClassLoader không thể tìm thấy lớp thích hợp trong khi tải tại thời điểm chạy. ClassNotFoundException là một ngoại lệ đã được kiểm tra và NoClassDefFoundError là một Lỗi không được chọn.

Có nhiều loại ClassLoader khác nhau tải các lớp từ các nguồn khác nhau, đôi khi nó có thể gây ra thiếu tệp JAR thư viện hoặc đường dẫn lớp không chính xác khiến trình tải không thể tải lớp tại thời điểm chạy.

ClassNotFoundException

ClassNotFoundException xảy ra khi chúng tôi cố gắng tải một lớp tại thời điểm chạy bằng Reflection và nếu các tệp lớp đó bị thiếu thì ứng dụng hoặc chương trình được ném với ClassNotFoundException Ngoại lệ. Không có gì để kiểm tra tại thời điểm biên dịch vì nó đang tải lớp trong thời gian chạy.

Ví dụ

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);
      }
   }
}

Đầu ra

You are trying to search for a class is not existing. java.lang.ClassNotFoundException: Test


NoClassDefFoundError

NoClassDefFoundError được ném khi một lớp đã được biên dịch với một lớp cụ thể từ classpath nhưng nếu lớp đó không khả dụng trong thời gian chạy. Thiếu tệp JAR là lý do cơ bản nhất để nhận được NoClassDefFoundError . Theo tài liệu Java API "Định nghĩa lớp được tìm kiếm tồn tại khi lớp đang thực thi được biên dịch, nhưng không còn tìm thấy định nghĩa nữa."

Ví dụ

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();
   }
}

Khi chúng tôi biên dịch cả hai lớp, chúng tôi sẽ nhận được hai tệp lớp Test1.class Test2.class, trong khi chạy Test2 chỉ cần xóa Test1.class thì chúng tôi sẽ nhận được NoClassDefFoundError như bên dưới

Đầu ra

Exception in thread "main" java.lang.NoClassDefFoundError: Test1
         at Test2.main(Test2.java:9)