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)