যখন আপনার কোডটি "নতুন Y ()" চালায় এবং এটি Y শ্রেণীর সন্ধান করতে পারে না তখন একটি NoClassDefFoundError (NCDFE) হয়।
এটি সহজেই হতে পারে যে অন্যান্য মন্তব্যগুলির পরামর্শ অনুসারে ওয়াই আপনার শ্রেণি লোডার থেকে অনুপস্থিত, তবে এটি হতে পারে যে ওয়াই ক্লাসটি স্বাক্ষরিত নয় বা একটি অবৈধ স্বাক্ষর রয়েছে, বা ওয়াই কোনও লোড করা হয়েছে যা আপনার কোডের সাথে দৃশ্যমান নয় class , বা এমনকি যে ওয়াই Z এর উপর নির্ভর করে যা উপরের কোনও কারণে লোড করা যায়নি।
যদি এটি ঘটে থাকে, তবে জেভিএম এক্স (এনসিডিএফই) লোড করার ফলাফলটি মনে রাখবে এবং আপনি যখনই ওয়াইয়ের কাছে জিজ্ঞাসা করবেন তখনই এটি আপনাকে না জানিয়ে কেন কেবল একটি নতুন এনসিডিএফই ফেলে দেবে:
শ্রেণীকক্ষে {
স্ট্যাটিক ক্লাস বি {}
পাবলিক স্ট্যাটিক শূন্য মূল (স্ট্রিং আরগস []) {
System.out.println ("প্রথম প্রচেষ্টা নতুন খ ():");
চেষ্টা করুন {নতুন খ (); } ধরা (নিক্ষেপযোগ্য টি)। t.প্রিন্টস্ট্যাকট্রেস ();}
System.out.println ("\ n সেকেন্ড চেষ্টা নতুন খ ():");
চেষ্টা করুন {নতুন খ (); } ধরা (নিক্ষেপযোগ্য টি)। t.প্রিন্টস্ট্যাকট্রেস ();}
}
}
এটি কোথাও a.java হিসাবে সংরক্ষণ করুন
কোডটি কেবল নতুন "বি" শ্রেণিতে দু'বার ইনস্ট্যান্ট করার চেষ্টা করে, এটি ব্যতীত এর কোনও বাগ নেই এবং এটি কিছু করে না।
এর সাথে কোডটি সঙ্কলন করুন javac a.java
, তারপরে অনুরোধ করে একটি চালান java -cp . a
- এটি কেবল দুটি লাইনের পাঠ্য মুদ্রণ করা উচিত এবং এটি ত্রুটি ছাড়াই সূক্ষ্মভাবে চালানো উচিত।
তারপরে অনুপস্থিত বা দূষিত শ্রেণীর অনুকরণের জন্য "a $ b.class" ফাইলটি মুছে দিন (বা এটি আবর্জনায় ভরাট করুন, বা এর উপর a.class অনুলিপি করুন)। যা ঘটে তা এখানে:
প্রথম প্রচেষ্টা নতুন খ ():
java.lang.NoClassDefFoundError: a $ b
a.main এ (a.java:5)
কারণ: java.lang.ClassNotFoundException: a $ b
java.net.URLClassLoader এ r ১.০০ রান (URLClassLoader.javaferences00)
জাভা.সিকিউরিতে
java.net.URLClassLoader.findClass এ (URLClassLoader.javaedia88)
java.lang.ClassLoader.loadClass এ (ClassLoader.java:307)
সূর্য.মিস্ক.লানচারে $ অ্যাপক্লাসলডার.লোডক্লাস (লঞ্চার.জভা 30:30)
java.lang.ClassLoader.loadClass এ (ClassLoader.java:252)
java.lang.ClassLoader.loadClassIntern (ClassLoader.java:320) এ
... 1 এর আরও বেশি
দ্বিতীয় প্রচেষ্টা নতুন খ ():
java.lang.NoClassDefFoundError: a $ b
a.main এ (a. java:7)
ক্লাসনটফাউন্ডএক্সেপশনে প্রথম অনুরোধের ফলাফল হয় (শ্রেণি লোডার যখন ক্লাসটি খুঁজে না পায় তখন ছুঁড়ে ফেলা হয়), যা অবশ্যই একটি চেক করা NoClassDefFoundError এ আবৃত করা উচিত, যেহেতু প্রশ্নযুক্ত কোডটি new b()
কেবলমাত্র কাজ করা উচিত।
দ্বিতীয় প্রচেষ্টা অবশ্যই ব্যর্থ হবে, তবে আপনি দেখতে পেলেন যে মোড়ানো ব্যতিক্রম আর কিছু নয়, কারণ ক্লাসলোডার মনে হয় ব্যর্থ শ্রেণীর লোডারদের মনে রাখে। আপনি কেবলমাত্র এনসিডিএফই দেখেন যা ঘটেছিল তা সম্পর্কে কোনও ধারণা নেই।
সুতরাং আপনি যদি কোনও মূল কারণ ছাড়াই কোনও এনসিডিএফই দেখতে পান তবে ত্রুটির কারণ অনুসন্ধান করার জন্য ক্লাসটি যখন প্রথম লোড হয়েছিল তখন আপনি আবার ট্র্যাক করতে পারেন কিনা তা আপনাকে দেখতে হবে।
-verbose
(যেমন-verbose:class -verbose:jni
) সাহায্যে জেভিএম চালানো দেখতে পাই - তবে তাদের উত্তরের নীচে মোগসি রিপোর্ট করেছেন যে এটি কোনও অতিরিক্ত দরকারী তথ্য সরবরাহ করে না :(