NoClassDefFoundError (NCDFE) terjadi ketika kode Anda menjalankan "Y baru ()" dan tidak dapat menemukan kelas Y.
Mungkin saja bahwa Y hilang dari pemuat kelas Anda seperti komentar lain yang disarankan, tetapi bisa jadi bahwa kelas Y tidak ditandatangani atau memiliki tanda tangan tidak valid, atau bahwa Y dimuat oleh classloader berbeda yang tidak terlihat oleh kode Anda , atau bahkan Y tergantung pada Z yang tidak dapat dimuat karena alasan di atas.
Jika ini terjadi, maka JVM akan mengingat hasil pemuatan X (NCDFE) dan itu hanya akan membuang NCDFE baru setiap kali Anda meminta Y tanpa memberi tahu Anda alasannya:
kelas A {
kelas statis b {}
public static static utama (String args []) {
System.out.println ("Upaya pertama yang baru b ():");
coba {new b (); } catch (Throwable t) {t.printStackTrace ();}
System.out.println ("\ nMencoba baru b ():");
coba {new b (); } catch (Throwable t) {t.printStackTrace ();}
}
}
simpan ini sebagai a.java di suatu tempat
Kode hanya mencoba membuat instance kelas "b" baru dua kali, selain itu, tidak memiliki bug, dan tidak melakukan apa pun.
Kompilasi kode dengan javac a.java
, Kemudian jalankan dengan memohon java -cp . a
- itu hanya akan mencetak dua baris teks, dan itu harus berjalan dengan baik tanpa kesalahan.
Kemudian hapus file "a $ b.class" (atau isi dengan sampah, atau salin a.class di atasnya) untuk mensimulasikan kelas yang hilang atau rusak. Inilah yang terjadi:
Upaya pertama yang baru b ():
java.lang.NoClassDefFoundError: a $ b
di a.main (a.java 5-10)
Disebabkan oleh: java.lang.ClassNotFoundException: a $ b
di java.net.URLClassLoader $ 1.run (URLClassLoader.java:00)
di java.security.AccessController.doPrivileged (Metode Asli)
di java.net.URLClassLoader.findClass (URLClassLoader.java:188)
di java.lang.ClassLoader.loadClass (ClassLoader.java:307)
di sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
di java.lang.ClassLoader.loadClass (ClassLoader.java:252)
di java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... 1 lagi
Upaya kedua baru b ():
java.lang.NoClassDefFoundError: a $ b
di a.main (a.java:7)
Doa pertama menghasilkan ClassNotFoundException (dilemparkan oleh pemuat kelas ketika tidak dapat menemukan kelas), yang harus dibungkus dengan NoClassDefFoundError yang tidak dicentang, karena kode yang dipermasalahkan ( new b()
) seharusnya hanya berfungsi.
Upaya kedua tentu saja akan gagal juga, tetapi seperti yang Anda lihat pengecualian dibungkus tidak lebih, karena ClassLoader tampaknya ingat pemuat kelas yang gagal. Anda hanya melihat NCDFE yang sama sekali tidak tahu apa yang sebenarnya terjadi.
Jadi jika Anda pernah melihat NCDFE tanpa akar penyebab, Anda perlu melihat apakah Anda dapat melacak kembali saat pertama kali kelas dimuat untuk menemukan penyebab kesalahan.
-verbose
(misalnya-verbose:class -verbose:jni
) membantu - tetapi mogsie melaporkan di bawah jawaban mereka bahwa ini tidak memberikan informasi tambahan yang berguna :(