Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa ClassNotFoundException và NoClassDefFoundError trong Java?


Cả ClassNotFoundException và NoClassDefFoundError là lỗi khi JVM hoặc ClassLoader không thể tìm thấy class phù hợp khi load tại run-time. ClassNotFoundException là checked exception và NoClassDefFoundError là Error thuộc unchecked.

Có nhiều loại ClassLoader load class từ nguồn khác nhau, đôi khi có thể gây thiếu file JAR thư viện hoặc class-path không đúng khiến loader không load được class tại run-time.

ClassNotFoundException

ClassNotFoundException xảy ra khi chúng ta cố load một class tại run-time dùng Reflection và nếu các file class đó bị thiếu thì ứng dụng hoặc chương trình ném ClassNotFoundException. Không có gì để kiểm tra tại compile-time vì nó load class tại run-time.

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

Kết quả

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


NoClassDefFoundError

NoClassDefFoundError được ném khi một class đã được compile với một class cụ thể từ classpath nhưng nếu cùng class đó không có sẵn tại run-time. Thiếu file JAR là lý do cơ bản nhất để gặp NoClassDefFoundError. Theo Java API docs: "The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found."

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 compile cả hai class, chúng ta sẽ có hai file class Test1.class và Test2.class, khi chạy class Test2 chỉ cần xóa file Test1.class thì sẽ gặp NoClassDefFoundError như dưới

Kết quả

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