एक NoClassDefFoundError (NCDFE) तब होता है जब आपका कोड "नया Y ()" चलता है और यह Y वर्ग को नहीं खोज सकता है।
यह केवल यह हो सकता है कि Y आपके वर्ग लोडर से गायब है जैसे अन्य टिप्पणियां सुझाती हैं, लेकिन यह हो सकता है कि Y वर्ग पर हस्ताक्षर नहीं है या उसके पास एक अवैध हस्ताक्षर है, या कि Y आपके कोड को दिखाई नहीं दे रहा एक अलग वर्ग लोडर द्वारा लोड किया गया है , या यहां तक कि वाई जेड पर निर्भर करता है जो उपरोक्त कारणों में से किसी के लिए लोड नहीं किया जा सकता है।
यदि ऐसा होता है, तो JVM को X (NCDFE) लोड करने का परिणाम याद होगा और यह हर बार एक नया NCDFE फेंकेगा, जब आप वाई से पूछेंगे कि आप यह क्यों कह रहे हैं:
कक्षा {
स्थिर वर्ग b {}
सार्वजनिक स्थैतिक शून्य main (String [] args[]) {
System.out.println ("पहला प्रयास नया b ():");
कोशिश {नया बी (); } पकड़ (फेंकने योग्य t) {t.printStackTrace ();}
System.out.println ("\ n नया प्रयास नया b ():");
कोशिश {नया बी (); } पकड़ (फेंकने योग्य t) {t.printStackTrace ();}
}
}
इसे बचाने के लिए a.java कहीं
कोड बस एक नए "बी" वर्ग को दो बार पलटने की कोशिश करता है, इसके अलावा, इसमें कोई बग नहीं है, और यह कुछ भी नहीं करता है।
के साथ कोड संकलित करें javac a.java
, फिर आह्वान करके चलाएं java -cp . a
- यह केवल पाठ की दो पंक्तियों को प्रिंट करना चाहिए, और यह त्रुटियों के बिना ठीक चलना चाहिए।
फिर लापता या दूषित वर्ग को अनुकरण करने के लिए "एक $ b.class" फ़ाइल को हटा दें (या इसे कचरे से भर दें, या उस पर कॉपी करें)। यहाँ क्या होता है:
पहला प्रयास नया b ():
java.lang.NoClassDefFoundError: एक $ b
a.main (a.java और) पर
इसके कारण: java.lang.ClassNotFoundException: a $ b
java.net.URLClassLoader $ 1.run (URLClassLoader.java:200) पर
java.security.AccessController.doPrivileged (मूल विधि) पर
java.net.URLClassLoader.findClass (URLClassLoader.java:188) पर
java.lang.ClassLoader.loadClass (ClassLoader.java:307) पर
sun.misc.auncher पर $ AppClassLoader.loadClass (Launcher.java:301)
java.lang.ClassLoader.loadClass (ClassLoader.java:252) पर
java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320) पर
... 1 और
दूसरा प्रयास नया बी ():
java.lang.NoClassDefFoundError: एक $ b
सुबह। (a.java:7)
पहली मंगलाचरण एक ClassNotFoundException (वर्ग लोडर द्वारा फेंका गया जब यह कक्षा नहीं पा सकता है), जिसे एक अनियंत्रित NoClassDefFoundError में लपेटा जाना चाहिए, क्योंकि प्रश्न में कोड ( new b()
केवल काम करना चाहिए)।
दूसरा प्रयास निश्चित रूप से विफल भी होगा, लेकिन जैसा कि आप देख सकते हैं कि लिपटे अपवाद कोई और नहीं है, क्योंकि क्लासऑलर को विफल वर्ग लोडर याद है। आप केवल एनसीडीएफई को देखते हैं कि वास्तव में क्या हुआ है।
इसलिए यदि आपको कभी कोई NCDFE बिना किसी मूल कारण के दिखाई देता है, तो आपको यह देखने की आवश्यकता है कि क्या आप त्रुटि का कारण जानने के लिए कक्षा में पहली बार लोड किए गए थे।
-verbose
(जैसे-verbose:class -verbose:jni
) मदद करता है - लेकिन उनके जवाब के नीचे मोगी की रिपोर्ट है कि इससे कोई अतिरिक्त उपयोगी जानकारी नहीं मिलती है :(