noclassdeffounderror va classnotfoundexception


javob bering 1:

ClassNotFoundException va NoClassDefFoundError muayyan ish vaqti davomida topilmasa sodir bo'ladi. Biroq, ular turli xil stsenariylarda yuzaga keladi.

ClassNotFoundException istisnosiz, siz darsni Class.forName () yoki loadClass () usullaridan foydalangan holda yuklaganingizda va yuqorida aytib o'tilgan sinflar sinf yo'lida topilmaganda yuzaga keladi.

NoClassDefFoundError - bu kompilyatsiya vaqtida ma'lum bir sinf mavjud bo'lganda paydo bo'lgan xato, lekin ish vaqtida etishmayotgan.

ClassNotFoundException

ClassNotFoundException - bu ish vaqti davomida Class.forName () yoki loadClass () yoki findSystemClass () usullaridan foydalangan holda sinfni yuklashga harakat qilganda bajariladigan ish vaqti istisnosidir va belgilangan nom bilan sinf sinf yo'lida topilmadi. Masalan, siz MySQL yoki Oracle ma'lumotlar bazalariga ulanishga harakat qilganingizda va yo'lni kerakli JAR fayllari bilan yangilamaganingizda ushbu holatga duch kelishingiz mumkin. Ko'pincha, bu istisno siz dasturni kerakli JAR fayllari bilan yangilanmasdan dasturni ishga tushirishga to'g'ri keladi.

Masalan, agar sinfda "oracle.jdbc.driver.OracleDriver" klass topilmasa, quyidagi dastur ClassNotFoundException-ni tashlaydi.

jamoat sinfidagi MainClass{ ommaviy statik void main (String [] args) { harakat qilib ko'ring { Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace (); } }}

Agar siz yuqoridagi dasturni kerakli JAR fayllari bilan classpathni yangilamasdan ishlasangiz, sizga quyidagicha istisno qilinadi:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriverjava.net.URLClassLoader.findClass-da (noma'lum manba)java.lang.ClassLoader.loadClass-da (noma'lum manba)sun.misc.Launcher-da $ AppClassLoader.loadClass (noma'lum manba)java.lang.ClassLoader.loadClass-da (noma'lum manba)java.lang.Class.forName0-da (Native Method)java.lang.Class.forName-da (noma'lum manba)pack1.MainClass.main-da (MainClass.java:17)

NoClassDefFoundError

NoClassDefFoundError - Java Runtime tizimi sinfning ta'rifini yuklashga harakat qilganda tashlangan xato va bu sinf ta'rifi endi mavjud emas. Kerakli sinf ta'rifi kompilyatsiya vaqtida mavjud edi, ammo u ish vaqtida yo'q edi. Masalan, quyidagi dasturni kompilyatsiya qiling.

sinf A{ // ba'zi kod}jamoat B{ ommaviy statik void main (String [] args) { A a = yangi A (); }}

Yuqoridagi dasturni kompilyatsiya qilganingizda ikkita .class fayl yaratiladi. Biri A.class va boshqasi B.class. Agar siz A.class faylini olib tashlasangiz va B.class faylini ishga tushirsangiz, Java Runtime System NoClassDefFoundError-ni quyidagicha tashlaydi:

"Main" ipidan istisno java.lang.NoClassDefFoundError: AMainClass.main-da (MainClass.java:10)Sabab: java.lang.ClassNotFoundException: Ajava.net.URLClassLoader.findClass-da (URLClassLoader.java:381)java.lang.ClassLoader.loadClass-da (ClassLoader.java:424)sun.misc.Launcher-da $ AppClassLoader.loadClass (Launcher.java:331)java.lang.ClassLoader.loadClass-da (ClassLoader.java:357)

javob bering 2:

ClassNotFoundException va NoClassDefFoundError muayyan ish vaqti davomida topilmasa sodir bo'ladi. Biroq, ular turli xil stsenariylarda yuzaga keladi.

ClassNotFoundException istisnosiz, siz darsni Class.forName () yoki loadClass () usullaridan foydalangan holda yuklaganingizda va yuqorida aytib o'tilgan sinflar sinf yo'lida topilmaganda yuzaga keladi.

NoClassDefFoundError - bu kompilyatsiya vaqtida ma'lum bir sinf mavjud bo'lganda paydo bo'lgan xato, lekin ish vaqtida etishmayotgan.

ClassNotFoundException

ClassNotFoundException - bu ish vaqti davomida Class.forName () yoki loadClass () yoki findSystemClass () usullaridan foydalangan holda sinfni yuklashga harakat qilganda bajariladigan ish vaqti istisnosidir va belgilangan nom bilan sinf sinf yo'lida topilmadi. Masalan, siz MySQL yoki Oracle ma'lumotlar bazalariga ulanishga harakat qilganingizda va yo'lni kerakli JAR fayllari bilan yangilamaganingizda ushbu holatga duch kelishingiz mumkin. Ko'pincha, bu istisno siz dasturni kerakli JAR fayllari bilan yangilanmasdan dasturni ishga tushirishga to'g'ri keladi.

Masalan, agar sinfda "oracle.jdbc.driver.OracleDriver" klass topilmasa, quyidagi dastur ClassNotFoundException-ni tashlaydi.

jamoat sinfidagi MainClass{ ommaviy statik void main (String [] args) { harakat qilib ko'ring { Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace (); } }}

Agar siz yuqoridagi dasturni kerakli JAR fayllari bilan classpathni yangilamasdan ishlasangiz, sizga quyidagicha istisno qilinadi:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriverjava.net.URLClassLoader.findClass-da (noma'lum manba)java.lang.ClassLoader.loadClass-da (noma'lum manba)sun.misc.Launcher-da $ AppClassLoader.loadClass (noma'lum manba)java.lang.ClassLoader.loadClass-da (noma'lum manba)java.lang.Class.forName0-da (Native Method)java.lang.Class.forName-da (noma'lum manba)pack1.MainClass.main-da (MainClass.java:17)

NoClassDefFoundError

NoClassDefFoundError - bu Java Runtime tizimi sinfning ta'rifini yuklashga harakat qilganda tashlangan xato va bu sinf ta'rifi endi mavjud emas. Kerakli sinf ta'rifi kompilyatsiya vaqtida mavjud edi, ammo u ish vaqti vaqtida etishmayotgan edi. Masalan, quyidagi dasturni kompilyatsiya qiling.

sinf A{ // ba'zi kod}jamoat B{ ommaviy statik void main (String [] args) { A a = yangi A (); }}

Yuqoridagi dasturni kompilyatsiya qilganingizda ikkita .class fayl yaratiladi. Biri A.class va boshqasi B.class. Agar siz A.class faylini olib tashlasangiz va B.class faylini ishlatsangiz, Java Runtime System NoClassDefFoundError-ni quyidagicha tashlaydi:

"Main" ipidan istisno java.lang.NoClassDefFoundError: AMainClass.main-da (MainClass.java:10)Sabab: java.lang.ClassNotFoundException: Ajava.net.URLClassLoader.findClass-da (URLClassLoader.java:381)java.lang.ClassLoader.loadClass-da (ClassLoader.java:424)sun.misc.Launcher-da $ AppClassLoader.loadClass (Launcher.java:331)java.lang.ClassLoader.loadClass-da (ClassLoader.java:357)

javob bering 3:

Class.otName () yoki loadClass () usullaridan foydalangan holda darslarni yuklashga harakat qilganingizda, ClassNotFoundException istisno bo'lib, yuqorida qayd etilgan sinflar sinf yo'lida topilmaydi.

NoClassDefFoundError - bu kompilyatsiya vaqtida ma'lum bir sinf mavjud bo'lganda paydo bo'lgan xato, lekin ish vaqtida etishmayotgan.

Java API texnik xususiyatlaridan farq quyidagicha.

Uchun

ClassNotFoundException

:

  • Dastur sinfda o'zining string nomi orqali yuklamoqchi bo'lganida tashlanadi:
  • Class sinfidagi forName usuli.
  • ClassLoader sinfidagi findSystemClass usuli.
  • ClassLoader sinfidagi loadClass usuli.

lekin belgilangan nom bilan sinf uchun hech qanday ta'rif topilmadi.

Uchun

NoClassDefFoundError

: Java Virtual Machine yoki ClassLoader nusxasi sinfning ta'rifiga (oddiy usul qo'ng'irog'ining bir qismi sifatida yoki yangi iborani ishlatgan holda yangi misol yaratishda) yuklashga harakat qilsa va tashlab yuborish kerak bo'lsa, otib tashlang va sinfning hech qanday ta'rifi topilmadi. . Sinov uchun qidiruv ta'rifi hozirgi vaqtda bajarilayotgan sinf kompilyatsiya qilinganda mavjud edi, ammo endi uni aniqlab bo'lmaydi. Shunday qilib, NoClassDefFoundError manbai muvaffaqiyatli kompilyatsiya qilinganida paydo bo'lgan, ammo ish vaqtida zarur sinf fayllari topilmadi. Bu JAR fayllarini tarqatish yoki ishlab chiqarishda ro'y berishi mumkin bo'lgan narsa bo'lishi mumkin, bunda barcha kerakli sinf fayllari mavjud emas. ClassNotFoundException-ga kelsak, u ish vaqtida darslarga aks ettirish qo'ng'iroqlarini amalga oshirishga urinishi bilan bog'liq bo'lishi mumkin, ammo dastur chaqirmoqchi bo'lgan sinflar mavjud emas. Ularning orasidagi farq shundaki, biri xato, ikkinchisi istisno. NoClassDefFoundError-da xato va Java Virtual Machine-da u topishi kutilgan sinfni topishda muammolarga duch keladi. Tarkibida ishlashi kutilgan dastur sinf fayllari topilmagani sababli ishlamaydi yoki kompilyatsiya vaqtida ishlab chiqarilgan yoki duch kelgan dastur bilan bir xil emas. Bu juda muhim xatodir, chunki dasturni JVM tomonidan ishga tushirish mumkin emas.

Boshqa tomondan, ClassNotFoundException istisno bo'lib, shuning uchun u biroz kutilgan va tiklanadigan narsadir. Ko'zgularni ishlatish xatolarga olib kelishi mumkin (ba'zi narsalar kutilganidek bajarilmasligi mumkin. Barcha kerakli sinflar mavjudligini tekshirish uchun vaqtni tekshirish mavjud emas, shuning uchun kerakli darslarni topishda har qanday muammolar ish vaqtida paydo bo'ladi. .

ClassNotFoundException

ClassNotFoundException - bu ish vaqti davomida Class.forName () yoki loadClass () yoki findSystemClass () usullaridan foydalangan holda sinfni yuklashga harakat qilganda bajariladigan ish vaqti istisnosidir va belgilangan nom bilan sinf sinf yo'lida topilmadi. Masalan, siz MySQL yoki Oracle ma'lumotlar bazalariga ulanishga harakat qilganingizda va yo'lni kerakli JAR fayllari bilan yangilamaganingizda ushbu holatga duch kelishingiz mumkin. Ko'pincha, bu istisno siz dasturni kerakli JAR fayllari bilan yangilanmasdan dasturni ishga tushirishga to'g'ri keladi.

Masalan, agar sinfda "oracle.jdbc.driver.OracleDriver" klass topilmasa, quyidagi dastur ClassNotFoundException-ni tashlaydi.

Batafsil o'qing

Java: ClassNotFoundException vs NoClassDefFoundError

misollar va boshqa foydalanish holatlari bilan.


javob bering 4:

ClassNotFoundException va NoClassDefFoundError muayyan ish vaqti davomida topilmasa sodir bo'ladi. Biroq, ular turli xil stsenariylarda yuzaga keladi.

Class.otName () yoki loadClass () usullari va yuqorida ko'rsatilgan sinflar yordamida ish vaqtida sinfni yuklamoqchi bo'lganingizda, ClassNotFoundException istisno yuzaga keladi.

NoClassDefFoundError - ma'lum bir sinf kompilyatsiya vaqtida bo'lganida, lekin ish vaqtida etishmayotgan xato (bu xatoni hal qilib bo'lmaydi)