ClassNotFoundException और NoClassDefFoundError दोनों ही एरर हैं जब JVM या ClassLoader रन-टाइम पर लोड करते समय उपयुक्त क्लास नहीं ढूंढ पाता। ClassNotFoundException एक चेक्ड अपवाद है और NoClassDefFoundError एक Error है जो अनचेक्ड के अंतर्गत आता है।
विभिन्न प्रकार के ClassLoader अलग-अलग स्रोतों से क्लासेस लोड करते हैं, कभी-कभी यह लाइब्रेरी JAR फाइल्स के गायब होने या गलत क्लास-पथ का कारण बन सकता है जो लोडर को रन-टाइम पर क्लास लोड करने में असमर्थ बनाता है।
ClassNotFoundException
ClassNotFoundException तब आता है जब हम रिफ्लेक्शन का उपयोग करके रन-टाइम पर एक क्लास लोड करने का प्रयास करते हैं और यदि वे क्लास फाइल्स गायब हैं तो एप्लिकेशन या प्रोग्राम ClassNotFoundException अपवाद के साथ फेंका जाता है। कंपाइल-टाइम पर जांचने के लिए कुछ भी नहीं है क्योंकि यह रन-टाइम पर क्लास लोड कर रहा है।
उदाहरण
public class ClassNotFoundExceptionTest {
public static void main(String[] args) {
try {
Class.forName("Test");
} catch (ClassNotFoundException cnfe) {
System.err.println("आप एक ऐसी क्लास खोजने का प्रयास कर रहे हैं जो मौजूद नहीं है। " + cnfe);
}
}
}
आउटपुट
आप एक ऐसी क्लास खोजने का प्रयास कर रहे हैं जो मौजूद नहीं है। java.lang.ClassNotFoundException: Test
NoClassDefFoundError
NoClassDefFoundError तब फेंका जाता है जब एक क्लास को क्लासपथ से एक विशिष्ट क्लास के साथ कंपाइल किया गया हो लेकिन वही क्लास रन-टाइम के दौरान उपलब्ध न हो। गायब JAR फाइल्स NoClassDefFoundError प्राप्त करने का सबसे मूल कारण हैं। जावा 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)