ClassNotFoundException এবং NoClassDefFoundError উভয়ই তখন হয় যখন JVM বা ClassLoader রানটাইমে লোড করার সময় উপযুক্ত ক্লাস খুঁজে পায় না। ClassNotFoundException হলো একটি চেকড এক্সেপশন এবং NoClassDefFoundError হলো একটি Error যা আনচেকড ক্যাটাগরিতে পড়ে।
বিভিন্ন ধরনের ClassLoader বিভিন্ন সোর্স থেকে ক্লাস লোড করে, কখনো কখনো লাইব্রেরি JAR ফাইল মিসিং বা ভুল ক্লাসপাথের কারণে লোডার রানটাইমে ক্লাস লোড করতে পারে না।
ClassNotFoundException
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 তখন থ্রো হয় যখন একটি ক্লাস কম্পাইল হয়েছে ক্লাসপাথ থেকে একটি নির্দিষ্ট ক্লাস দিয়ে কিন্তু রানটাইমে সেই ক্লাসটি উপলব্ধ নয়। মিসিং JAR ফাইলগুলো NoClassDefFoundError পাওয়ার সবচেয়ে বেসিক কারণ। জাভা API ডক্স অনুযায়ী "The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found."
উদাহরণ
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)