ما الأسباب وما هي الاختلافات بين noclassdeffoundror و classnotfoundexception؟

StackOverflow https://stackoverflow.com/questions/1457863

سؤال

ماهو الفرق بين NoClassDefFoundError و ClassNotFoundException?

ما الذي يسبب إلقاؤه؟ كيف يمكن حلها؟

غالبا ما تواجه هذه الرمادات عند تعديل التعليمات البرمجية الموجودة لتضمين ملفات جرة جديدة. لقد قمت بضربها على جانب العميل ويد الخادم لتطبيق Java الموزعة عبر WebStart.

الأسباب المحتملة التي صادفتها:

  1. الحزم غير المدرجة في build.xml لجانب العميل من التعليمات البرمجية
  2. وقت التشغيل ClassPath مفقود للجراعات الجديدة التي نستخدمها
  3. النسخة تعارض مع جرة السابقة

عندما أواجه هذه اليوم، أتعلق نهج درب الأخطاء للحصول على أشياء تعمل. أحتاج إلى مزيد من الوضوح والتفاهم.

هل كانت مفيدة؟

المحلول

الفرق من مواصفات Java API هو كما يلي.

بالنسبة ClassNotFoundException:

ألقيت عندما يحاول التطبيق تحميل في فئة من خلال اسم السلسلة باستخدام:

  • ال forName طريقة في الفصل Class.
  • ال findSystemClass طريقة في الفصل ClassLoader.
  • ال loadClass طريقة في الفصل ClassLoader.

ولكن لا يمكن العثور على تعريف للفئة مع الاسم المحدد.

بالنسبة NoClassDefFoundError:

ألقيت إذا كان الجهاز الظاهري جافا أو ClassLoader يحاول المثيل تحميل في تعريف الفصل (كجزء من مكالمة طريقة طبيعية أو كجزء من إنشاء مثيل جديد باستخدام التعبير الجديد) ولا يمكن العثور على تعريف للفئة.

موجود تعريف الفئة للفئة عند تجميع الفئة المنفذة حاليا، ولكن لا يمكن العثور على التعريف.

لذلك، يبدو أن NoClassDefFoundError يحدث عندما تم تجميع المصدر بنجاح، ولكن في وقت التشغيل، المطلوبة class لم يتم العثور على الملفات. قد يكون هذا شيئا يمكن أن يحدث في توزيع أو إنتاج ملفات جرة، حيث لا يكون كل ما هو مطلوب class تم تضمين الملفات.

أما بالنسبة لل ClassNotFoundException, ، يبدو أنه قد ينبع من محاولة إجراء مكالمات عاكسة للفصول الدراسية في وقت التشغيل، ولكن الطبقات يحاول البرنامج الاتصال به غير موجود.

الفرق بين الاثنين هو أن واحد هو Error والآخر هو Exception. وبعد مع NoClassDefFoundError هو Error وينشأ من الجهاز الظاهري Java وجود مشاكل في العثور على فئة من المتوقع أن تجدها. لا يمكن إجراء برنامج كان من المتوقع أن يعمل في وقت الترجمة class الملفات غير الموجودة، أو ليست هي نفسها كما تم إنتاجها أو مواجهتها في تجميع الوقت. هذا خطأ حرج للغاية، حيث لا يمكن بدء البرنامج من قبل JVM.

من ناحية أخرى، ClassNotFoundException هو Exception, ، لذلك من المتوقع إلى حد ما، وهو شيء قابل للاسترداد. قد يكون استخدام الانعكاس عرضة للخطأ (نظرا لوجود بعض التوقعات بأن الأمور قد لا تذهب كما هو متوقع. لا يوجد شيك في تجميع الوقت لمعرفة أن جميع الفئات المطلوبة موجودة، لذا فإن أي مشاكل في العثور على الفئات المرغوبة ستظهر في وقت التشغيل وبعد

نصائح أخرى

يتم طرح ClassnotfoundException عندما لا يتم العثور على الفئة المبلغ عنها من قبل Classlader. هذا يعني عادة أن الفئة مفقودة من ClassPath. قد يعني ذلك أيضا أن الفئة المعنية تحاول تحميلها من فئة أخرى تم تحميلها في كدرودا الوالدين وبالتالي فئة من الفصل الدراسي غير مرئي. هذا هو الحال في بعض الأحيان عند العمل في بيئات أكثر تعقيدا مثل خادم التطبيقات (WebSphere سيئة السمعة لمثل هذه المشكلات النموذجية).

الناس غالبا ما يميلون إلى الخلط java.lang.NoClassDefFoundError مع java.lang.ClassNotFoundException ومع ذلك هناك تمييز مهم. على سبيل المثال استثناء (خطأ منذ ذلك الحين java.lang.NoClassDefFoundError هي فئة فرعية من java.lang.Error)

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

لا يعني أن فئة ActiveMQConnectionClactory ليست في ClassPath. infact لها عكس ذلك تماما. هذا يعني أنه تم العثور على ActiveMQConnectionSFactorasty المصنفة من قبل ClassLoader عند محاولة تحميل الفصل، فقد تم تشغيل خطأ في قراءة تعريف الفصل. يحدث هذا عادة عندما تحتوي الفصل المعني على كتل ثابتة أو أعضاء يستخدم فئة غير موجودة من قبل Classlader. إذن للعثور على الجاني، عرض مصدر الفصل في السؤال (ActiveMQConnectionSfactory في هذه الحالة) ابحث عن الرمز باستخدام كتل ثابتة أو أعضاء ثابت. إذا لم يكن لديك الوصول إلى المصدر، فقم ببساطة بكم ببساطة باستخدام JAD.

عند فحص التعليمات البرمجية، قل أنك تجد خطا من التعليمات البرمجية مثل أدناه، تأكد من أن الفئة SCECLASS في Classpath.

private static SomeClass foo = new SomeClass();

نصيحة: لمعرفة أي جرة، تنتمي فئة، يمكنك استخدام Jarfinder موقع الويب. يتيح لك ذلك تحديد اسم فئة باستخدام أحرف البدل ويبحث عن الفصل في قاعدة بيانات الجرار الخاصة به. يتيح لك Jarhoo أن تفعل الشيء نفسه ولكن لم تعد حرة للاستخدام.

إذا كنت ترغب في تحديد موقع الجرة التي تنتمي إليها الفصل في مسار محلي، فيمكنك استخدام أداة مساعدة مثل Jarscan ( http://www.inetfeedback.com/jarscan/ ). يمكنك فقط تحديد الفصل الذي ترغب في تحديد موقع مسار الدليل الجذر حيث تريد أن تبدأ في البحث عن الفئة في الجرار وملفات ZIP.

NoClassDefFoundError هو خطأ في الارتباط أساسا. يحدث عند محاولة إنشاء وكائن (ثابت مع "جديد") ولن يتم العثور عليه عندما كان أثناء التجميع.

ClassNotFoundException هو أكثر عام وهو استثناء وقت التشغيل عند محاولة استخدام فئة غير موجودة. على سبيل المثال، لديك معلمة في وظيفة تقبل واجهة ويمتمر شخص ما في فئة تنفذ هذه الواجهة ولكن ليس لديك حق الوصول إلى الفصل. كما يغطي حالة تحميل الفئة الديناميكية، مثل استخدام loadClass() أو Class.forName().

يحدث noclassdeffoundror (NCDFE) عندما يعمل التعليمات البرمجية الخاصة بك "NEW Y ()" ولا يمكن العثور على فئة Y.

قد يكون هذا هو ببساطة أن y مفقود من محمل الفصول الدراسي مثل التعليقات الأخرى التي تشير إليها، ولكن قد يكون من المفترض أن يتم توقيع فئة y أو لديه توقيع غير صالح، أو أن y محملة من قبل Accorder مختلف غير مرئي لرمزك ، أو حتى أن y يعتمد على Z والتي لا يمكن تحميلها لأي من الأسباب المذكورة أعلاه.

إذا حدث هذا، فسوف تتذكر JVM نتيجة تحميل X (NCDFE) وسيقوم ببساطة بإلقاء NCDFE جديد في كل مرة تطلب فيها Y دون إخبارك لماذا:

فئة A {satic class b {} public satic الفراغ الرئيسي (string args []) {system.out.println ("المحاولة الأولى جديد B ():")؛ حاول {جديد ب ()؛ } الصيد (T.PrintstackTrace ()؛} system.out.out.out.println (" NSecond محاولة جديد B ():")؛ حاول {جديد ب ()؛ } الصيد (T.PrintstackTrace ()؛}}}

احفظ هذا باسم A.Java في مكان ما

يحاول الرمز ببساطة إنشاء فئة "ب" جديدة مرتين، بخلاف ذلك، لا يحتوي على أي أخطاء، ولا تفعل أي شيء.

ترجمة التعليمات البرمجية javac a.java, ، ثم قم بتشغيل الإلحاق java -cp . a - يجب أن تطبع فقط سطرين من النص، ويجب تشغيله غرامة دون أخطاء.

ثم احذف ملف "$ b.class" (أو املأها بالقمامة، أو نسخ A.Class فوقه) لمحاكاة الفئة المفقودة أو التالفة. إليك ما يحدث:

المحاولة الأولى جديدة ب () .java: 200) في java.security.accesscontroller.doplivileded (الطريقة الأصلية) في java.net.urlclassloader.findclass (urlclassloader.java:188) في java.lang.classloader.loadclass (classlader.java:307) عند الشمس. misc.launcher $ Appclassloader.loadclass (launcher.java:301) في java.lang.classloader.loadclass (classloader.java:252) في java.lang.classloader.loadclassinternal (classlader.java:320) ... 1 آخر ثانية محاولة جديدة ب (): java.lang.noclassdeffoundrorror: A $ B في A.MAIN (A.Java: 7)

يؤدي الاستغناء الأول إلى تصنيف ClassnotfoundException (يتم إلقاؤه بواسطة محمل الفئة عندما لا يمكن العثور على الفصل)، والتي يجب أن تكون ملفوفة في noclassdeffoundrorror غير مرفوضة، لأن الرمز المعني (new b()) يجب أن تعمل فقط.

ستفشل المحاولة الثانية بالطبع أيضا، ولكن كما ترى الاستثناء المغطى ليس أكثر من ذلك، لأن التصنيف يبدو أنه يتذكر محملات فاشلة فاشلة. ترى فقط NCDFE مع أي دليل على الإطلاق لما حدث بالفعل.

لذلك إذا رأيت من أي وقت مضى NCDFE بدون سبب جذر، فأنت بحاجة إلى معرفة ما إذا كان يمكنك التتبع مرة أخرى إلى المرة الأولى في المرة الأولى التي يتم فيها تحميل الفئة للعثور على سبب الخطأ.

من http://www.javaroots.com/2013/02/classnotfoundexception-vs.html.:

ClassNotFoundException : يحدث عندما تعذر على محمل الفئة العثور على الفئة المطلوبة في مسار الفصل. لذلك، يجب عليك التحقق من مسار الفصل الخاص بك وإضافة الفئة في ClassPath.

NoClassDefFoundError : هذا أكثر صعوبة تصحيح وإيجاد السبب. يتم إلقاء ذلك عند ترجمة الوقت في الوقت الحاضر الفئات المطلوبة، ولكن في وقت التشغيل يتم تغيير الفصول الدراسية أو إزالتها أو إزالتها الثابتة من الفئة إلقاء الاستثناءات. هذا يعني أن الفئة التي يتم تحميلها موجودة في ClassPath، ولكن تتم إزالة واحدة من الفئات المطلوبة بهذه الفئة أو فشل تحميلها بواسطة برنامج التحويل البرمجي. لذلك يجب أن ترى الطبقات التي تعتمد على هذه الفئة.

مثال:

public class Test1
{
}


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

}

الآن بعد تجميع كل من الفصول، إذا قمت بحذف ملف Test1.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: ألقيت إذا حاول الجهاز الظاهري Java التحميل في تعريف الفصل ولا يمكن العثور على تعريف للفئة.

ما هو السبب في الحصول على كل منهم وأي عملية تفكير حول كيفية التعامل مع مثل هذه الأخطاء؟

انهم مرتبطون ارتباطا وثيقا. أ ClassNotFoundException يتم إلقاؤه عندما تبحث Java عن فئة معينة بالاسم ولم تتمكن من تحميله بنجاح. أ NoClassDefFoundError ألقيت عندما تبحث Java عن فئة كانت مرتبطة ببعض التعليمات البرمجية الموجودة، ولكنها لم تتمكن من العثور عليها لسبب واحد أو آخر (على سبيل المثال، classpath خطأ، نسخة خاطئة من جافا، نسخة خاطئة من مكتبة) وهي قاتلة تماما كما يشير إلى أن شيئا ما قد ذهب خطأ بشكل سيء.

إذا كنت قد حصلت على خلفية ج، فإن CNFE يشبه الفشل في dlopen()/dlsym() و NCDFE هي مشكلة مع الرابط؛ في الحالة الثانية، يجب ألا يتم تجميع ملفات الفئة المعنية في الواقع في التكوين الذي تحاول استخدامه.

مثال 1:

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

إذا com/example/Class1 غير موجود في أي من casspaths، ثم يلقي ClassNotFoundException.

مثال رقم 2:

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

إذا com/example/Class2 موجودة أثناء تجميع B، ولكن غير موجود أثناء التنفيذ، ثم يلقي NoClassDefFoundError.

كلاهما يجري استثناءات الوقت.

درجة بدون استثنائات يتم إلقاؤه عندما يكون هناك محاولة لتحميل الفئة عن طريق الرجوع إليها عبر سلسلة. على سبيل المثال المعلمة إلى class.forname () هي سلسلة، وهذا يثير إمكانات الأسماء الثنائية غير الصحيحة التي يتم تمريرها إلى الفصل الدراسي.

يتم طرح ClassnotfoundException عند مواجهة الاسم الثنائي غير صالح يحتمل أن يصادف؛ على سبيل المثال، إذا كان اسم الفصل يحتوي على حرف "/"، فأنت مرتبط بالحصول على ClassnotfoundException. يتم إلقاؤها أيضا عند عدم توفر الفئة المشار إليها مباشرة على ClassPath.

من ناحية أخرى، noclassdeffoundror. هذا خطئ

  • عند التمثيل الفعلي الفعلي للفئة - ملف .class غير متاح،
  • أو تم تحميل الفئة بالفعل في كدرودر مختلف (عادة ما يكون هناك فصل من الوالدين قد حمل الفصل وبالتالي لا يمكن تحميل الفئة مرة أخرى)،
  • أو إذا تم العثور على تعريف فئة غير متوافق - لا يتطابق الاسم في ملف الفصل مع الاسم المطلوب،
  • أو (الأهم من ذلك) إذا تعذر تحديد موقع فئة تعتمد وتحميلها. في هذه الحالة، ربما تم تحديد الفئة المشار إليها مباشرة وتحميلها، ولكن الطبقة التابعة غير متوفرة أو لا يمكن تحميلها. هذا سيناريو حيث يمكن تحميل الفئة المشار إليها مباشرة عبر الفصل. هذا يشير إلى فشل في الارتباط.

باختصار، عادة ما يتم طرح Noclassdeffoundrorror على بيانات جديدة () أو تداعيات طريقة تقوم بتحميل فئة غائبة سابقا (بدلا من التحميل القائم على السلسلة للفصول الدراسية ل ClassnotfoundException)، عندما يكون النصف غير قادر على العثور على أو تحميل تعريف الفصل ( س).

في نهاية المطاف، فهو تصل إلى تطبيق Classlader لرمي مثيل ClassnotfoundException عندما يكون غير قادر على تحميل فئة. تنفذ معظم تطبيقات Classloader المخصصة هذا نظرا لتوسيع نطاق URLClassloader. عادة ما لا يرمي القشصون بشكل صريح صريحا noclassdeffoundror على أي من تطبيقات الأسلوب - عادة ما يتم طرح هذا الاستثناء من JVM في برنامج التحويل البرمجي النقاط الساخنة، وليس من قبل Classlader نفسه.

الفرق بين ClassnotfoundException مقابل Noclassdeffoundror

enter image description here

مع الأسماء نفسها يمكننا بسهولة تحديد واحد من Exception وغيرها من Error.

استثناء: تحدث الاستثناءات أثناء تنفيذ البرنامج. يمكن للمبرمج التعامل مع هذه الاستثناء من خلال تجربة كتلة الصيد. لدينا نوعان من الاستثناءات. فحص الاستثناء الذي يلقي في وقت الترجمة. استثناءات وقت التشغيل التي يتم إلقاؤها في وقت التشغيل، عادة ما يحدث هذا الاستثناء بسبب البرمجة السيئة.

خطأ: هذه ليست استثناءات على الإطلاق، فهي خارج نطاق مبرمج. عادة ما يتم إلقاء هذه الأخطاء بواسطة JVM.


enter image description here مصدر الصورة

فرق:

درجة بدون استثنائات:

  • فشل محمل الصف تحقق رمز بايت فئة نذكره ربط المرحلة من الفئة تحميل النظام الفرعي نحن نحصل ClassNotFoundException.
  • ClassNotFoundException هو استثناء فحص مشتق مباشرة من java.lang.Exception فئة وتحتاج إلى توفير معالجة صريحة لذلك
  • ClassNotFoundException يأتي عندما يكون هناك تحميل واضح من الفئة تشارك من خلال توفير اسم الفصل عند وقت التشغيل باستخدام Classloader.loadClass ()، Class.Forname () و Classloader.findsystemClass ().

noclassdeffoundrror:

  • فشل محمل الصف حل مراجع فئة في ربط المرحلة من الفئة تحميل النظام الفرعي نحن نحصل NoClassDefFoundError.
  • NoClassDefFoundError هو خطأ مشتق من LinkageError الفئة، التي يتم استخدامها للإشارة إلى حالات الخطأ، حيث يحتوي الفصل على تبعية في بعض الفئة الأخرى وتغيير هذه الفئة بعد التجميع.
  • NoClassDefFoundError هو نتيجة تحميل ضمني من الفئة بسبب استدعاء طريقة من هذا الفصل أو أي وصول متغير.

التشابه:

  • كلاهما NoClassDefFoundError و ClassNotFoundException ترتبط عدم توفر الفصل في وقت التشغيل.
  • كلاهما ClassNotFoundException و NoClassDefFoundError ترتبط جافا classpath.

بالنظر إلى إجراءات Sussystem Loader:

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

هذه مقالة ساعدتني كثيرا لفهم الفرق: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

في حالة حدوث خطأ أثناء تحميل الفئة، فإن مثيل فرعي من LinkageError. يجب إلقاؤه عند نقطة في البرنامج الذي يستخدم (بشكل مباشر أو غير مباشر) الفصل أو الواجهة التي يتم تحميلها.

إذا حاول الجهاز الظاهري Java من أي وقت مضى تحميل الفئة C أثناء التحقق (§5.4.1) أو الدقة (§5.4.3) (ولكن ليس التهيئة (§5.5))، ومحمل الفئة المستخدمة لبدء تحميل ج يلقي مثال درجة بدون استثنائات, ، ثم يجب على الجهاز الظاهري Java رمي مثيل noclassdeffoundror. الذي السبب هو مثيل درجة بدون استثنائات.

لذلك درجة بدون استثنائات هو السبب الجذري لل noclassdeffoundror..
و noclassdeffoundror. هي حالة خاصة من خطأ تحميل النوع، الذي يحدث في الرابط خطوة.

إضافة سبب واحد ممكن في الممارسة:

  • ClassnotfoundException: كما قال كليتوس، يمكنك استخدام واجهة بينما فئة الواجهة الموروثة ليست في classpath. على سبيل المثال، نمط مزود الخدمة (أو محدد الخدمة) حاول تحديد موقع بعض الفئة غير الموجودة
  • noclassdeffoundrrrror: تم العثور على فئة معين في حين لم يتم العثور على تبعية فئة معين

في الممارسة العملية، خطأ قد يتم إلقاؤها بصمت, ، على سبيل المثال، يمكنك تقديم مهمة مؤقت وفي مهمة الموقت التي يرميها خطأ, ، بينما في معظم الحالات، يمسك البرنامج فقط استثناء. وبعد ثم الموقت انتهت الحلقة الرئيسية دون أي معلومات. خطأ مماثل في noclassdeffoundror هو استثنائيين, ، عندما يكون تهيئة ثابتة أو تهيئة متغير ثابت يستقر استثناء.

درجة بدون استثنائات هو استثناء تم التحقق منه يحدث عندما نقول JVM لتحميل فئة من خلال اسم السلسلة باستخدام Class.Forname () أو Classloader.findSystemClass () أو Classlasslass.

في معظم الأحيان، يحدث هذا الاستثناء عند محاولة تشغيل تطبيق دون تحديث ClassPath مع ملفات جرة المطلوبة. على سبيل المثال، ربما شهدت هذا الاستثناء عند القيام برمز JDBC للاتصال بقاعدة البيانات IEMYSQL لكن ClassPath الخاص بك لا يحتوي على جرة لذلك.

noclassdeffoundror. يحدث خطأ عندما يحاول JVM تحميل فئة معينة هي جزء من تنفيذ التعليمات البرمجية (كجزء من استدعاء الأسلوب العادي أو كجزء من إنشاء مثيل باستخدام الكلمة الأساسية الجديدة) ولهذه الفئة غير موجودة في Classpath لكنها كانت موجودة في وقت ترجمة الوقت لأنه من أجل تنفيذ البرنامج الذي تحتاج إليه، تحتاج إلى تجميعه وإذا كنت تحاول استخدام فئة غير مترجمة لن ترفع خطأ في الترجمة.

أدناه هو الوصف المختصر

enter image description here

يمكنك قراءة كل شيء عن classnotfoundexception vs noclassdeffoundror لمزيد من التفاصيل.

أذكر نفسي ما يلي مرارا وتكرارا عندما أحتاج إلى التحديث

درجة بدون استثنائات

التسلسل الهرمي للفئة

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

أثناء تصحيح الأخطاء

  1. جرة المطلوبة، فئة مفقودة من classpath.
  2. تحقق من جميع الجرار المطلوبة في ClassPath من JVM.

noclassdeffoundror.

التسلسل الهرمي للفئة

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

أثناء تصحيح الأخطاء

  1. مشكلة في تحميل فئة ديناميكيا، والتي تم تجميعها بشكل صحيح
  2. مشكلة مع كتل ثابتة، منشئين، INIT () أساليب الطبقة المعتمدة والخطأ الفعلي ملفوفة بواسطة طبقات متعددة [خاصة عند استخدام الربيع، سبات الاستخدام الفعلي ملفوفة وستحصل على noclassdeferror
  3. عندما تواجه "ClassnotfoundException" تحت كتلة ثابتة من الطبقة التابعة
  4. مشكلة في إصدارات الفصل. يحدث هذا عندما يكون لديك نسختين V1، V2 من نفس الفئة تحت جرة / حزم مختلفة، والتي تم تجميعها بنجاح باستخدام V1 و V2 يتم تحميلها في وقت التشغيل والتي لا تحتوي على الأساليب / المتفارقة ذات الصلة وسترى هذا الاستثناء. [لقد قررت هذه المشكلة عن طريق إزالة نسخة مكررة من فئة LOG4J ذات الصلة تحت جرار متعددة ظهرت في ClassPath

تحدث classnotfoundexception و noclassdeffoundrorror عندما لا يتم العثور على فئة معينة في وقت التشغيل. كيف تحدث في سيناريوهات مختلفة.

ClassnotfoundException استثناء يحدث عند محاولة تحميل فئة في وقت التشغيل باستخدام الأساليب Class.Forname () أو LoadClass () وغير موجود الفئات المذكورة في ClassPath.

    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)

noclassdeffoundror هو خطأ يحدث عندما تكون فئة معينة موجودة في وقت الترميز، ولكن كان مفقودا في وقت التشغيل.

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

عند ترجمة البرنامج أعلاه، سيتم إنشاء ملفتين .class. واحد هو A.Class وآخر هو B.Class. إذا قمت بإزالة ملف A.Class وتشغيل ملف B.Class، فسيقوم نظام تشغيل Java رمي noclassdeffoundrror مثل أدناه:

    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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top