NoClassDefFoundError এবং ClassNotFoundException এর মধ্যে কী কারণ এবং কী পার্থক্য রয়েছে?


371

মধ্যে পার্থক্য কি NoClassDefFoundErrorএবং ClassNotFoundException?

তাদের নিক্ষেপ করার কারণ কী? কীভাবে তাদের সমাধান করা যায়?

নতুন জার ফাইল অন্তর্ভুক্ত করার জন্য বিদ্যমান কোডটি সংশোধন করার সময় আমি প্রায়শই এই থ্রোয়েবলগুলির মুখোমুখি হই। ওয়েব স্টার্টের মাধ্যমে বিতরণ করা একটি জাভা অ্যাপ্লিকেশানের জন্য আমি তাদের ক্লায়েন্ট পক্ষ এবং সার্ভার উভয় দিকেই আঘাত করেছি।

সম্ভাব্য কারণগুলি আমি পেরেছি:

  1. build.xmlকোডের ক্লায়েন্টের পক্ষে প্যাকেজগুলি অন্তর্ভুক্ত নেই
  2. আমরা যে নতুন জারগুলি ব্যবহার করছি তার জন্য রানটাইম ক্লাসপথ অনুপস্থিত
  3. পূর্ববর্তী জারের সাথে সংস্করণ বিবাদ

আমি আজ যখন এগুলির মুখোমুখি হয়েছি তখন জিনিসগুলি কাজ করতে আমি একটি ট্রেইল এবং ত্রুটির পদ্ধতি গ্রহণ করি। আমার আরও স্পষ্টতা এবং বোধগম্যতা দরকার।


আমি প্রায়শই -verbose(যেমন -verbose:class -verbose:jni) সাহায্যে জেভিএম চালানো দেখতে পাই - তবে তাদের উত্তরের নীচে মোগসি রিপোর্ট করেছেন যে এটি কোনও অতিরিক্ত দরকারী তথ্য সরবরাহ করে না :(
পিজেট্রাইল

উত্তর:


388

জাভা এপিআই স্পেসিফিকেশন থেকে পার্থক্য নিম্নরূপ।

এর জন্য ClassNotFoundException:

কোনও অ্যাপ্লিকেশন যখন তার স্ট্রিং নামটি ব্যবহার করে কোনও ক্লাসে লোড করার চেষ্টা করে তখন ছুঁড়ে দেওয়া হয়:

  • forNameক্লাসে পদ্ধতি Class
  • findSystemClassক্লাসে পদ্ধতি ClassLoader
  • loadClassক্লাসে পদ্ধতি ClassLoader

তবে নির্দিষ্ট নাম সহ শ্রেণীর জন্য কোনও সংজ্ঞা পাওয়া যায়নি।

এর জন্য NoClassDefFoundError:

জাভা ভার্চুয়াল মেশিন বা কোনও ClassLoaderউদাহরণ কোনও শ্রেণির সংজ্ঞায় (একটি সাধারণ পদ্ধতি কলের অংশ হিসাবে বা নতুন এক্সপ্রেশনটি ব্যবহার করে একটি নতুন উদাহরণ তৈরির অংশ হিসাবে) লোড করার চেষ্টা করে এবং শ্রেণীর কোনও সংজ্ঞা পাওয়া না গেলে নিক্ষিপ্ত হয়।

বর্তমানে সম্পাদনকারী শ্রেণিটি সংকলিত হওয়ার সময় সন্ধানী শ্রেণীর সংজ্ঞাটি বিদ্যমান ছিল, তবে সংজ্ঞাটি আর খুঁজে পাওয়া যাবে না।

সুতরাং, এটি প্রদর্শিত হয় যে NoClassDefFoundErrorউত্সটি সফলভাবে সংকলিত হওয়ার পরে ঘটেছিল, তবে রানটাইমের সময় প্রয়োজনীয় classফাইলগুলি খুঁজে পাওয়া যায় নি। এটি এমন কিছু হতে পারে যা জেআর ফাইলগুলির বিতরণ বা উত্পাদনে ঘটতে পারে, যেখানে সমস্ত প্রয়োজনীয় classফাইল অন্তর্ভুক্ত ছিল না।

হিসাবে ClassNotFoundException, এটি প্রদর্শিত হয় যে এটি রানটাইমের সময় ক্লাসগুলিতে প্রতিবিম্বিত কল করার চেষ্টা থেকে শুরু হতে পারে, তবে প্রোগ্রামটি যে ক্লাসগুলিতে কল করার চেষ্টা করছে তা বিদ্যমান নেই।

উভয়ের মধ্যে পার্থক্য হ'ল একটি হ'ল একটি Errorএবং অন্যটি একটি Exception। সাথে NoClassDefFoundErrorএটি একটি Errorএবং এটি জাভা ভার্চুয়াল মেশিন থেকে উদ্ভূত এমন একটি শ্রেণীর সন্ধান করতে সমস্যা হয়েছে যা থেকে এটি প্রত্যাশিত। একটি প্রোগ্রাম যা সংকলন সময়ে কাজ করার আশা করা হয়েছিল classফাইলগুলি না পাওয়ার কারণে এটি চলতে পারে না বা সংকলন সময়ে উত্পাদিত বা সম্মুখীন হওয়ার মতো নয়। এটি একটি দুর্দান্ত সমালোচনা, কারণ প্রোগ্রামটি জেভিএম দ্বারা আরম্ভ করা যায় না।

অন্যদিকে, এটি ClassNotFoundExceptionএকটি Exception, তাই এটি কিছুটা প্রত্যাশিত এবং এটি পুনরুদ্ধারযোগ্য something প্রতিবিম্ব ব্যবহার করা ত্রুটি-প্রবণ হতে পারে (কিছু প্রত্যাশা রয়েছে যে জিনিসগুলি প্রত্যাশার মতো না যেতে পারে। সমস্ত প্রয়োজনীয় শ্রেণীর অস্তিত্ব আছে তা দেখার জন্য কোনও সংকলন-সময় চেক নেই, তাই পছন্দসই ক্লাসগুলি অনুসন্ধানে কোনও সমস্যা রানটাইমে উপস্থিত হবে) ।


53
NoClassDefFoundErrorক্লাসের স্ট্যাটিক ব্লক বা স্থির ক্ষেত্রের সূচনাতে সমস্যা হয় (ব্যতিক্রম ছুঁড়ে দেওয়া) সাধারণত হয় তখন ক্লাসটি সফলভাবে আরম্ভ করা যায় না।
দাগাং

7
ভোট দিন। একটি একটি Errorএবং অন্যটি একটি Exception। :)
রবি

83

যখন রিপোর্ট করা ক্লাসটি ClassLoader দ্বারা পাওয়া যায় না তখন একটি ClassNotFoundException নিক্ষেপ করা হয়। এর অর্থ সাধারণত ক্লাসটি ক্লাসস্প্যাথ থেকে অনুপস্থিত। এর অর্থ এইও হতে পারে যে প্রশ্নে থাকা বর্গটি অন্য শ্রেণি থেকে লোড করার চেষ্টা করছে যা পিতামাত্ত শ্রেণীর লোডারে লোড করা হয়েছিল এবং তাই শিশু শ্রেণিবোর্ডার থেকে ক্লাসটি দৃশ্যমান নয়। অ্যাপ্লিকেশন সার্ভারের মতো আরও জটিল পরিবেশে কাজ করার সময় এটি কখনও কখনও ঘটে থাকে (ওয়েবস্পিয়ার এ জাতীয় শ্রেণীবদ্ধার সমস্যাগুলির জন্য কুখ্যাত)।

মানুষ প্রায়ই গুলান ঝোঁক java.lang.NoClassDefFoundErrorসঙ্গে java.lang.ClassNotFoundExceptionঅবশ্য সেখানে একটি গুরুত্বপূর্ণ পার্থক্য আছে। উদাহরণস্বরূপ একটি ব্যতিক্রম (আসলে একটি ত্রুটি java.lang.NoClassDefFoundErrorjava.lang.Error এর একটি সাবক্লাস) পছন্দ করে

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

অ্যাক্টিভ এমকিউসেকশনফ্যাক্টরি ক্লাস ক্লাসস্প্যাটে নেই এর অর্থ এই নয়। এর সম্পূর্ণ বিপরীত প্রভাব ফেলুন। এর অর্থ ক্লাস অ্যাকটিভিউ কিউ কানেকশনফ্যাক্টরি ক্লাসলডার দ্বারা পাওয়া গেছে তবে ক্লাসটি লোড করার চেষ্টা করার সময় এটি শ্রেণীর সংজ্ঞাটি পড়তে একটি ত্রুটির মধ্যে পড়ে। এটি সাধারণত ঘটে যখন প্রশ্নে ক্লাসে স্থির ব্লক বা সদস্য থাকে যা ক্লাসলোডার দ্বারা পাওয়া যায় নি এমন একটি ক্লাস ব্যবহার করে। সুতরাং অপরাধীকে সন্ধান করতে, প্রশ্নে শ্রেণীর উত্সটি দেখুন (এই ক্ষেত্রে অ্যাক্টিভএমকিউ কানেকশনফ্যাক্টরি) এবং স্ট্যাটিক ব্লক বা স্থির সদস্যদের ব্যবহার করে কোড সন্ধান করুন। যদি আপনার উত্স অ্যাক্সেস না থাকে, তবে কেবল জেএডি ব্যবহার করে এটি ছড়িয়ে দিন।

কোডটি পরীক্ষা করার সময়, আপনি নীচের মত কোডের একটি লাইন খুঁজে পেয়েছেন বলে নিশ্চিত করুন যে আপনার ক্লাসস্প্যাটে ক্লাস সোমারক্লাস রয়েছে।

private static SomeClass foo = new SomeClass();

টিপ: কোনও বর্গ কোন জারটির অন্তর্ভুক্ত তা নির্ধারণ করতে আপনি ওয়েব সাইট জারফাইন্ডার ব্যবহার করতে পারেন। এটি আপনাকে ওয়াইল্ডকার্ড ব্যবহার করে কোনও শ্রেণীর নাম নির্দিষ্ট করতে দেয় এবং এটি তার জারের ডাটাবেসে শ্রেণীর জন্য অনুসন্ধান করে। ঝাড়ু আপনাকে একই জিনিস করতে দেয় তবে এটি আর ব্যবহারের জন্য মুক্ত নয়।

যদি আপনি কোনও স্থানীয় পথে কোনও শ্রেণীর অন্তর্ভুক্ত জারটি সনাক্ত করতে চান তবে আপনি জারস্ক্যান ( http://www.inetfeedback.com/jarscan/ ) এর মতো কোনও ইউটিলিটি ব্যবহার করতে পারেন । আপনি কেবল যে ক্লাসটি সনাক্ত করতে চান সেটি এবং মূল ডিরেক্টরি পাথ নির্দিষ্ট করে দিন যেখানে আপনি জার এবং জিপ ফাইলগুলিতে শ্রেণীর সন্ধান শুরু করতে চান।


9
আমি মজার বিষয় যে এটি সঠিক উত্তরটি সর্বশেষে ভোট দিয়েছে। (এমনকি ভোট দেওয়ার আগে -১)। ক্লাসনটফাউন্ডএক্সেপশন মানে সিএল। ক্লাস ফাইলটি দেখে না। NoClassDefFoundError মানে .class ফাইলটি সেখানে লোডযোগ্য নয় (সম্ভবত জেএনআই ত্রুটি)।
ব্যবহারকারী 43685

1
এই উত্তরটি কি উত্তর ফর্ম কুলবারির সাথে বিরোধী নয়?
zardosht

আমি স্ট্যাটিক ব্লকের অনুরূপ উদাহরণ চেষ্টা করেছিলাম। আমার ক্লাস 1 এর স্ট্যাটিক ভেরিয়েবল রয়েছে "প্রাইভেট স্ট্যাটিক বি foo = নতুন বি ();" সংকলনের পরে, আমি বিন ফোল্ডার থেকে বি.ক্লাস ফাইলটি সরিয়েছি। এখন আমি তৃতীয় শ্রেণির প্রধান পদ্ধতি থেকে যখন ক্লাস 1 এর অবজেক্ট তৈরি করি। রারটিকে ফলস হিসাবে নিক্ষেপ করা হয়: -------- "থ্রেডে ব্যতিক্রম" মূল "জাভা.এলং.নোক্লাসডেফফাউন্ড এরিয়ার: স্প্রিং / বি" ........ সুতরাং এটি কোন শ্রেণীর সন্ধান পায় নি ঠিক তা উল্লেখ করেছে আইক্লাস স্থির ব্লকে উল্লেখ করা হয় এবং বাইরের শ্রেণি নয় o সুতরাং এটি এই উত্তরের বিপরীতে।
কৌশিক লেলে

"1 সম্পর্কিত স্পষ্টকরণের জন্য এর অর্থ এই নয় যে অ্যাক্টিভ এমকিউ কানেকশন ফ্যাক্টরি ক্লাস ক্লাসস্প্যাটে নেই"
আকিলা

35

NoClassDefFoundErrorমূলত একটি লিঙ্কেজ ত্রুটি। এটি ঘটে যখন আপনি কোনও বস্তুর চেষ্টা এবং ইনস্ট্যান্ট করবেন (স্থিতিহীনভাবে "নতুন") এবং এটি সংকলনের সময় পাওয়া যায় নি।

ClassNotFoundExceptionযখন আপনি অস্তিত্ব না থাকে এমন কোনও ক্লাস ব্যবহার করার চেষ্টা করবেন তখন এটি আরও সাধারণ এবং একটি রানটাইম ব্যতিক্রম। উদাহরণস্বরূপ, কোনও ফাংশনে আপনার একটি প্যারামিটার রয়েছে একটি ইন্টারফেস গ্রহণ করে এবং কেউ এমন একটি ক্লাসে পাস করে যা সেই ইন্টারফেসটি প্রয়োগ করে তবে আপনার ক্লাসে অ্যাক্সেস নেই। এটি যেমন ব্যবহার গতিশীল বর্গ লোড ক্ষেত্রে, কভার loadClass()বা Class.forName()


29

যখন আপনার কোডটি "নতুন 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:class:jniযদি জেএনআই ব্যবহার করা হয় তবে আমি সিনট্যাক্স সম্পর্কে নিশ্চিত নই। যদি এটি দরকারী হয় তবে সম্ভবত আপনি ফলাফলগুলি প্রদর্শন করতে পারেন।
পিজেট্রাইল

আমরাও -verbose:classনা -verbose:jniঅনুপস্থিত বর্গ প্রাসঙ্গিক কোন অতিরিক্ত আউটপুট দিতে।
মোগসি

1
এটি চেষ্টা করে দেখার জন্য ধন্যবাদ, ফলাফল হতাশ হলেও। (পিএস আমি তখন থেকেই খুঁজে পেয়েছি যে -verbose:class:jniএটি ভুল: একজনকে দুটি পৃথক বিকল্প নির্দিষ্ট করতে হবে -verbose:class -verbose:jni:)
পিজেট্রাইল

2
সর্বশেষ বাক্য * ১,০০,০০০: সুতরাং আপনি যদি কোনও মূল কারণবিহীন কোনও এনসিডিএফই দেখতে পান তবে ত্রুটির কারণ অনুসন্ধান করার জন্য ক্লাসটি যখন প্রথম লোড হয়েছিল তখন আপনি আবার ট্র্যাক করতে পারবেন কিনা তা আপনাকে দেখতে হবে।
বাতওয়াদ

20

Http://www.javaroots.com/2013/02/classnotfoundexception-vs.html থেকে :

ClassNotFoundException: ক্লাস লোডার যখন শ্রেণীর পথে প্রয়োজনীয় শ্রেণিটি খুঁজে না পায় তখন ঘটে। সুতরাং, মূলত আপনার ক্লাসের পথটি পরীক্ষা করা উচিত এবং ক্লাসপথে ক্লাস যুক্ত করা উচিত।

NoClassDefFoundError: এটি ডিবাগ করা এবং কারণটি খুঁজে পাওয়া আরও বেশি কঠিন। সংকলনের সময় প্রয়োজনীয় ক্লাস উপস্থিত থাকলে এটি নিক্ষেপ করা হয়, তবে রান সময়ে ক্লাসগুলি পরিবর্তন বা সরানো হয় বা শ্রেণীর স্ট্যাটিক প্রাথমিক ব্যতিক্রমগুলি ছুঁড়ে দেয় thre এর অর্থ হল যে শ্রেণিটি লোড হচ্ছে সেগুলি ক্লাসপথে উপস্থিত রয়েছে, তবে এই শ্রেণীর জন্য প্রয়োজনীয় যে ক্লাসগুলির একটি রয়েছে তা হয় সরানো হয়েছে বা সংকলক দ্বারা লোড করতে ব্যর্থ হয়েছে। সুতরাং আপনি এই ক্লাস উপর নির্ভরশীল ক্লাস দেখতে হবে।

উদাহরণ :

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

এখন উভয় ক্লাস সংকলনের পরে, আপনি যদি টেস্ট 1.class ফাইলটি মুছে ফেলেন এবং টেস্ট ক্লাস চালান, তবে এটি নিক্ষেপ করবে

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

ClassNotFoundException: কোনও অ্যাপ্লিকেশন তার নামের মাধ্যমে কোনও শ্রেণিতে লোড করার চেষ্টা করলে নিক্ষেপ করা হয়, তবে নির্দিষ্ট নামের শ্রেণীর জন্য কোনও সংজ্ঞা পাওয়া যায়নি।

NoClassDefFoundError: যদি জাভা ভার্চুয়াল মেশিন কোনও শ্রেণির সংজ্ঞা লোড করার চেষ্টা করে এবং শ্রেণীর কোনও সংজ্ঞা পাওয়া না যায় তবে ফেলে দেওয়া হয়।


জেভিএম দিয়ে -verbose, বা নির্দিষ্ট জেভিএম এর উপর নির্ভর করে কিছু অনুরূপ বিকল্প নিয়ে চলমান সম্পর্কে কী ? সম্ভবত -verbose:class, -verbose:class:jniযদি জেএনআই ব্যবহার করা হয় তবে আমি সিনট্যাক্স সম্পর্কে নিশ্চিত নই।
পিজেট্রাইল

-verbose:class:jniভুল, কিন্তু আপনি দুটি পৃথক অপশন প্রেরণ করতে পারেন: -verbose:class -verbose:jni
পিজেট্রাইল

15

এগুলির ত্রুটিগুলি কীভাবে মোকাবেলা করতে হবে সে সম্পর্কে প্রতিটি চিন্তাভাবনা এবং কোন চিন্তা প্রক্রিয়া করার কারণ কী?

তারা নিবিড়ভাবে সম্পর্কিত। একজন ClassNotFoundExceptionনিক্ষিপ্ত হয় যখন জাভা নামে একটি বিশেষ শ্রেনীর খুঁজছেন গিয়ে সফলভাবে লোড করতে পারিনি। একজন NoClassDefFoundErrorনিক্ষিপ্ত হয় যখন জাভা একটি বর্গ যে কিছু বিদ্যমান কোডে লিঙ্কযুক্ত হয়েছিল খুঁজছেন গিয়েছিলাম, কিন্তু এটা এক কারণে অথবা অন্য (যেমন, ভুল ক্লাসপাথ, জাভা, একটি লাইব্রেরি ভুল সংস্করণের ভুল সংস্করণ) জন্য খুঁজে পাইনি এবং পুঙ্খানুপুঙ্খভাবে মারাত্মক হয় যেহেতু এটি নির্দেশ করে যে কিছু খারাপভাবে গেছে gone

আপনি যদি সি ব্যাকগ্রাউন্ড পেয়ে থাকেন তবে একটি সিএনএফই হ'ল ব্যর্থতার মতো dlopen()/ dlsym()এবং এনসিডিএফই লিংকের সাথে সমস্যা; দ্বিতীয় ক্ষেত্রে, সম্পর্কিত শ্রেণীর ফাইলগুলি আপনি যে কনফিগারেশনটি ব্যবহার করার চেষ্টা করছেন তা আসলে কখনই সংকলন করা উচিত হয়নি।


11

উদাহরণ # 1:

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

যদি com/example/Class1কোনও ক্লাসপথে উপস্থিত না থাকে তবে তা ছুড়ে দেয় ClassNotFoundException

উদাহরণ # 2:

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

com/example/Class2বি সংকলনের সময় যদি বিদ্যমান থাকে, তবে মৃত্যুদণ্ড কার্যকর করার সময় খুঁজে পাওয়া যায় না, তবে এটি ছুড়ে দেয় NoClassDefFoundError

উভয়ই রান টাইম ব্যতিক্রম।


9

ক্লাসনটফাউন্ডএক্সেপশন নিক্ষেপ করা হয় যখন স্ট্রিংয়ের মাধ্যমে রেফারেন্স করে ক্লাসটি লোড করার চেষ্টা করা হয়। উদাহরণস্বরূপ Class.forName () এ প্যারামিটারটি একটি স্ট্রিং, এবং এটি ক্লাসলোডারের কাছে অবৈধ বাইনারি নামগুলি পাস করার সম্ভাবনা বাড়িয়ে তোলে।

কোনও সম্ভাব্য অবৈধ বাইনারি নামটি সম্মুখীন হলে ClassNotFoundException নিক্ষেপ করা হয়; উদাহরণস্বরূপ, শ্রেণীর নামের যদি '/' অক্ষর থাকে তবে আপনি ClassNotFoundException পেতে বাধ্য হন get সরাসরি রেফারেন্সযুক্ত শ্রেণি ক্লাসপথে উপলব্ধ না হলে এটি নিক্ষেপ করা হয়।

অন্যদিকে, NoClassDefFoundError নিক্ষেপ করা হয়

  • যখন শ্রেণীর প্রকৃত দৈহিক উপস্থাপনা - ক্লাস ফাইলটি অনুপলব্ধ থাকে,
  • বা ক্লাসটি অন্য কোনও ক্লাস লোডারে ইতিমধ্যে লোড করা হয়েছে (সাধারণত পিতামাত শ্রেণির লোডার ক্লাসটি লোড করত এবং তাই ক্লাসটি আবার লোড করা যায় না),
  • বা যদি কোনও বেমানান শ্রেণীর সংজ্ঞাটি পাওয়া গেছে - ক্লাস ফাইলে থাকা নামটি অনুরোধকৃত নামের সাথে মেলে না,
  • বা (সর্বাধিক গুরুত্বপূর্ণ) যদি নির্ভরশীল শ্রেণিটি অবস্থিত এবং লোড করা না যায়। এই ক্ষেত্রে, সরাসরি রেফারেন্সযুক্ত শ্রেণিটি অবস্থিত এবং লোড করা হতে পারে তবে নির্ভরশীল শ্রেণিটি উপলব্ধ নয় বা লোড করা যায় না। এটি এমন একটি দৃশ্য যেখানে সরাসরি রেফারেন্স করা ক্লাসটি Class.forName বা সমতুল্য পদ্ধতিগুলির মাধ্যমে লোড করা যায়। এটি সংযোগে ব্যর্থতা নির্দেশ করে।

সংক্ষেপে, একটি NoClassDefFoundError সাধারণত নতুন () স্টেটমেন্ট বা পদ্ধতি অনুরোধের উপর নিক্ষেপ করা হয় যা পূর্বে অনুপস্থিত শ্রেণি লোড করে (ClassNotFoundException জন্য ক্লাসগুলির স্ট্রিং-ভিত্তিক লোডিংয়ের বিপরীতে), যখন ক্লাস লোডার শ্রেণি সংজ্ঞা খুঁজে পেতে বা লোড করতে অক্ষম হয় ( গুলি)।

অবশেষে, এটি ক্লাস লোড করতে অক্ষম হলে ClassNotFoundException এর উদাহরণ নিক্ষেপ করা ClassLoader বাস্তবায়ন পর্যন্ত। তারা URLClassLoader প্রসারিত করার পরে বেশিরভাগ কাস্টম শ্রেণিবোর্ড বাস্তবায়ন এটি সম্পাদন করে। সাধারণত শ্রেণিবদ্ধকারীরা কোনও পদ্ধতি প্রয়োগের ক্ষেত্রে স্পষ্টভাবে একটি নো ক্লাসডেফফাউন্ডআরার নিক্ষেপ করে না - এই ব্যতিক্রমটি সাধারণত জেভিএম থেকে হটস্পট সংকলনে নিক্ষেপ করা হয়, ক্লাস লোডার নিজেই নয়।


'ক্লাস ফাইলে নামটি অনুরোধকৃত নামের সাথে মেলে না' উল্লেখ করার জন্য আপভোট করুন। এটি বেশ সাধারণ কারণ।
লার্নের মারকুইস

8

ClassNotFoundException বনাম NoClassDefFoundError মধ্যে পার্থক্য

এখানে চিত্র বর্ণনা লিখুন


স্ফটিক পরিষ্কার নয়। "ক্লাসপথে আপডেট হয়নি" অস্পষ্ট / অনর্থক। এটি হয় জারটি ক্লাসপথে উপস্থিত না হওয়া , বা জারটির ভুল সংস্করণ ক্লাসপথে রয়েছে। এবং বানান ত্রুটি। এবং (দীর্ঘশ্বাস) যেহেতু আপনি আপনার তথ্যকে মজাদার গ্রাফিক হিসাবে পোস্ট করেছেন, আমরা এটি ঠিক করতে পারি না।
স্টিফেন সি

8

নাম নিজেই সঙ্গে আমরা খুব সহজেই থেকে এক চিহ্নিত করতে পারেন Exceptionএবং অন্য এক থেকে Error

ব্যতিক্রম: প্রোগ্রাম কার্যকর করার সময় ব্যতিক্রম ঘটে। একজন প্রোগ্রামার ক্যাপ ব্লক ব্যবহার করে এই ব্যতিক্রমগুলি পরিচালনা করতে পারে। আমাদের দুটি ধরণের ব্যতিক্রম রয়েছে। সংকলনের সময় ছোঁড়া ব্যতিক্রম যা পরীক্ষা করে। রানটাইম ব্যতিক্রম যা রান সময় নিক্ষেপ করা হয়, এই ব্যতিক্রমগুলি সাধারণত খারাপ প্রোগ্রামিংয়ের কারণে ঘটে।

ত্রুটি: এগুলি মোটেই ব্যতিক্রম নয়, এটি প্রোগ্রামারের সুযোগের বাইরে। এই ত্রুটিগুলি সাধারণত জেভিএম ফেলে দেয়।


এখানে চিত্র বর্ণনা লিখুন চিত্র উত্স

পার্থক্য:

শ্রেণী পাওয়া ব্যতিক্রম:

  • ক্লাস লোডার ব্যর্থ যাচাই একটি বর্গ বাইট কোড আমরা উল্লেখ লিংক ফেজ এর বর্গ লোড সাব-সিস্টেম আমরা পেতে ClassNotFoundException
  • ClassNotFoundExceptionjava.lang.Exceptionক্লাস থেকে সরাসরি প্রাপ্ত চেক করা ব্যতিক্রম এবং এর জন্য আপনাকে সুস্পষ্ট হ্যান্ডলিং সরবরাহ করতে হবে
  • ClassNotFoundExceptionClassLoader.loadClass (), Class.forName () এবং ClassLoader.findSystemClass () ব্যবহার করে রানটাইমে ক্লাসের নাম সরবরাহ করে যখন ক্লাসের স্পষ্ট লোড যুক্ত হয় তখন উপস্থিত হয় ।

NoClassDefFoundError:

  • ক্লাস লোডার ব্যর্থ হয় সমাধানে একটি ক্লাসের রেফারেন্স লিংক ফেজ এর বর্গ লোড সাব-সিস্টেম আমরা পেতে NoClassDefFoundError
  • NoClassDefFoundErrorLinkageErrorক্লাস থেকে প্রাপ্ত একটি ত্রুটি , যা ত্রুটির ঘটনাগুলি চিহ্নিত করতে ব্যবহৃত হয়, যেখানে কোনও শ্রেণীর অন্য কোনও শ্রেণির উপর নির্ভরতা থাকে এবং সংকলনের পরে সেই শ্রেণিটি অসম্পূর্ণভাবে পরিবর্তিত হয়।
  • NoClassDefFoundErrorক্লাসের কোনও পদ্ধতি কল বা কোনও পরিবর্তনশীল অ্যাক্সেসের কারণে ক্লাসের অন্তর্নিহিত লোডের ফলাফল is

মিল:

  • উভয়ই NoClassDefFoundErrorএবং ClassNotFoundExceptionরান-টাইমে কোনও শ্রেণীর অপ্রাপ্যতার সাথে সম্পর্কিত।
  • উভয় ClassNotFoundExceptionএবং NoClassDefFoundErrorজাভা ক্লাসপাথ সম্পর্কিত।

3

শ্রেণি লোডার সুসিস্টেম ক্রিয়া দেওয়া:

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

এটি একটি নিবন্ধ যা পার্থক্য বুঝতে আমাকে অনেক সাহায্য করেছে: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

ক্লাস লোডিংয়ের সময় যদি কোনও ত্রুটি দেখা দেয়, তবে লিংকেজআরারের সাবক্লাসের একটি উদাহরণ অবশ্যই প্রোগ্রামের এক পর্যায়ে ফেলে দেওয়া উচিত যা (প্রত্যক্ষ বা পরোক্ষভাবে) শ্রেণি বা ইন্টারফেসটি লোড হচ্ছে ব্যবহার করে।

জাভা ভার্চুয়াল মেশিন যদি কখনও যাচাইকরণের সময় (§5.4.1) বা রেজোলিউশন (§5.4.3) (তবে আরম্ভ নয় (§5.5)), এবং শ্রেণি লোডার যা সি লোডিং শুরু করতে ব্যবহৃত হয় লোড করার চেষ্টা করে এর একটি দৃষ্টান্ত ছোঁড়া ClassNotFoundException , তারপর জাভা ভার্চুয়াল মেশিন একটি দৃষ্টান্ত নিক্ষেপ আবশ্যক NoClassDefFoundError যার কারণ উদাহরণস্বরূপ হয় ClassNotFoundException

সুতরাং একটি ClassNotFoundException একটা মূল কারণ NoClassDefFoundError
এবং একটি NoClassDefFoundError টাইপ লোডিং ত্রুটির একটি বিশেষ কেস, এটি লিঙ্কিং স্টেপে ঘটে ।


2

অনুশীলনে একটি সম্ভাব্য কারণ যুক্ত করুন:

  • ClassNotFoundException: ক্লিটাস যেমন বলেছিল, আপনি ইন্টারফেস ব্যবহার করেন যখন উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণি ইন্টারফেসের ক্লাসপথে নেই। উদাহরণস্বরূপ, পরিষেবা সরবরাহকারী প্যাটার্ন (বা পরিষেবা লোকেটার ) কিছু অ-বিদ্যমান শ্রেণি সনাক্ত করার চেষ্টা করুন
  • NoClassDefFoundError: প্রদত্ত শ্রেণীর নির্ভরতা পাওয়া যায় না এমন সময় প্রদত্ত শ্রেণীর সন্ধান পাওয়া যায়

বাস্তবে, ত্রুটি নিক্ষিপ্ত হতে পারে চুপটি , যেমন, আপনি একটি টাইমার টাস্ক জমা দিতে ও টাইমার টাস্ক এটা ছোঁড়ার ত্রুটি , যখন অধিকাংশ ক্ষেত্রে, আপনার প্রোগ্রাম শুধুমাত্র ক্যাচ ব্যতিক্রম । তারপরে টাইমার মূল লুপটি কোনও তথ্য ছাড়াই শেষ হয়। NoClassDefFoundError এর অনুরূপ ত্রুটি হ'ল এক্সপশনআইনিআইনিটিয়ালাইজার এরর , যখন আপনার স্ট্যাটিক ইনিশিয়ালাইজার বা স্ট্যাটিক ভেরিয়েবলের জন্য আরম্ভকারী ব্যতিক্রম নিক্ষেপ করে।


1

ক্লাসনটফাউন্ডএক্সেপশন হ'ল একটি পরীক্ষিত ব্যতিক্রম যা যখন আমরা জেভিএমকে ক্লাস.ফোর্নেম () বা ক্লাসলয়েডার.ফাইন্ডসিসটেমক্লাস () বা ক্লাসলয়েডার.লোডক্লাস () পদ্ধতি ব্যবহার করে ক্লাসপথে খুঁজে পাওয়া যায় না তখন স্ট্রিং নাম দিয়ে কোনও শ্রেণি লোড করতে বলি।

বেশিরভাগ সময়, যখন আপনি প্রয়োজনীয় জেআর ফাইলগুলি সহ শ্রেণিপথ আপডেট না করে কোনও অ্যাপ্লিকেশন চালানোর চেষ্টা করেন তখন এই ব্যতিক্রম ঘটে। উদাহরণস্বরূপ, আপনি আপনার ডাটাবেস ieMySQL- তে সংযোগ স্থাপনের জন্য জেডিবিসি কোড করার সময় এই ব্যতিক্রমটি দেখতে পেয়েছেন তবে আপনার ক্লাসপাথে এর জন্য জেআর নেই।

NoClassDefFoundError ত্রুটি ঘটে যখন জেভিএম কোনও নির্দিষ্ট ক্লাসটি লোড করার চেষ্টা করে যা আপনার কোড এক্সিকিউশনের অংশ (একটি সাধারণ পদ্ধতি কলের অংশ হিসাবে বা নতুন কীওয়ার্ড ব্যবহার করে একটি উদাহরণ তৈরির অংশ হিসাবে) এবং সেই শ্রেণিটি আপনার ক্লাসপথে উপস্থিত না থাকলেও ছিল সংকলনের সময়ে উপস্থিত কারণ আপনার প্রোগ্রামটি সম্পাদন করার জন্য আপনাকে এটি সংকলন করতে হবে এবং আপনি যদি এমন একটি ক্লাস ব্যবহার করতে চেষ্টা করছেন যা উপস্থিত সংকলক উপস্থিত নেই সংকলন ত্রুটি বাড়িয়ে তুলবে।

নীচে সংক্ষিপ্ত বিবরণ দেওয়া হল

এখানে চিত্র বর্ণনা লিখুন

আপনি আরও তথ্যের জন্য ClassNotFoundException বনাম NoClassDefFoundError সম্পর্কে সবকিছু পড়তে পারেন ।


0

আমার যখন পুনরায় রিফ্রেশ দরকার তখন আমি নিম্নলিখিতগুলি বার বার মনে করিয়ে দিই

শ্রেণী পাওয়া ব্যতিক্রম

ক্লাস হায়ারার্কি

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

ডিবাগ করার সময়

  1. প্রয়োজনীয় জার, ক্লাসপাথ থেকে ক্লাস অনুপস্থিত।
  2. সমস্ত প্রয়োজনীয় জারগুলি jvm এর ক্লাসপথে রয়েছে তা যাচাই করুন।

NoClassDefFoundError

ক্লাস হায়ারার্কি

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

ডিবাগ করার সময়

  1. একটি ক্লাস গতিশীল লোড করতে সমস্যা, যা সঠিকভাবে সংকলিত হয়েছিল
  2. স্ট্যাটিক ব্লক, কনস্ট্রাক্টর, আরআর () নির্ভর শ্রেণীর পদ্ধতিগুলির সাথে সমস্যা এবং আসল ত্রুটিটি একাধিক স্তর দ্বারা আবৃত হয় [বিশেষত আপনি যখন বসন্ত ব্যবহার করেন, তখন প্রকৃত ব্যতিক্রমটি হাইবারনেট মোড়ানো হয় এবং আপনি NoClassDefError পাবেন]
  3. আপনি যখন নির্ভরশীল শ্রেণীর স্থিতিশীল ব্লকের অধীনে "ClassNotFoundException" এর মুখোমুখি হন
  4. শ্রেণীর সংস্করণগুলির সাথে সমস্যা। এটি ঘটে যখন আপনার বিভিন্ন জার / প্যাকেজগুলির আওতায় একই শ্রেণীর দুটি সংস্করণ ভি 1, ভি 2 থাকে যা ভি 1 এবং ভি 2 ব্যবহার করে সফলভাবে সংকলিত হয়েছিল রানটাইমটিতে লোড করা হয় যার সাথে সম্পর্কিত পদ্ধতি / ভারস নেই এবং আপনি এই ব্যতিক্রমটি দেখতে পাবেন। [আমি একবার ক্লাসপথে উপস্থিত একাধিক জারের অধীনে লগ 4 জে সম্পর্কিত শ্রেণীর সদৃশ সরিয়ে এই সমস্যাটি সমাধান করেছি]

-1

ClassNotFoundException এবং NoClassDefFoundError ঘটে যখন কোনও নির্দিষ্ট ক্লাস রানটাইমের সময় খুঁজে পাওয়া যায় না ow তবুও এগুলি বিভিন্ন পরিস্থিতিতে দেখা যায়।

ক্লাসনটফাউন্ডএক্সেপশন একটি ব্যতিক্রম যা ঘটে যখন আপনি ক্লাস.ফর্মনেম () বা লোডক্লাস () পদ্ধতিগুলি এবং উল্লিখিত ক্লাসগুলি ক্লাসপথে খুঁজে না পেয়ে রান সময়ে ক্লাস লোড করার চেষ্টা করেন।

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }



    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

NoClassDefFoundError একটি ত্রুটি যা ঘটে যখন একটি নির্দিষ্ট শ্রেণি সংকলন সময়ে উপস্থিত হয়, কিন্তু রান সময় অনুপস্থিত।

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

আপনি উপরের প্রোগ্রামটি সংকলন করলে দুটি .class ফাইল উত্পন্ন হবে। একটি হ'ল এ.ক্লাস এবং অন্যটি হ'ল বি.ক্লাস। আপনি যদি এ.ক্লাস ফাইলটি সরান এবং বি.ক্লাস ফাইলটি চালান, জাভা রানটাইম সিস্টেমটি নীচের মতো নো-ক্লাসডেফফাউন্ডআরার নিক্ষেপ করবে:

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.