NoClassDefFoundError (NCDFE) kodunuz "new Y ()" çalıştırdığında ve Y sınıfını bulamadığında gerçekleşir.
Diğer yorumların önerdiği gibi Y'nin sınıf yükleyicinizde eksik olması olabilir, ancak Y sınıfının imzalı olmaması veya geçersiz bir imzası olması veya Y'nin kodunuz tarafından görülmeyen farklı bir sınıf yükleyici tarafından yüklenmesi olabilir veya Y bile yukarıdaki nedenlerden herhangi biri nedeniyle yüklenemeyen Z'ye bağlıdır.
Bu olursa, JVM, X (NCDFE) yüklemesinin sonucunu hatırlar ve nedenini söylemeden her Y istediğinde yeni bir NCDFE atar:
a sınıfı {
statik sınıf b {}
public static void main (Dize bağımsız değişkenleri []) {
System.out.println ("İlk denemede yeni b ():");
{yeni b (); } catch (Fırlatılabilir t) {t.printStackTrace ();}
System.out.println ("\ nİkinci deneme yeni b ():");
{yeni b (); } catch (Fırlatılabilir t) {t.printStackTrace ();}
}
}
bunu bir yerde a.java olarak kaydet
Kod sadece iki kez yeni bir "b" sınıfı başlatmaya çalışır, bunun dışında herhangi bir hata yoktur ve hiçbir şey yapmaz.
Kodu ile derleyin javac a.java
, Sonra a'yı çalıştırarak çalıştırın java -cp . a
- sadece iki satır metin yazdırmalı ve hatasız çalışmalıdır.
Ardından, eksik veya bozuk sınıfı simüle etmek için "a $ b.class" dosyasını silin (veya çöple doldurun veya üzerine a.class kopyalayın). İşte olanlar:
İlk denemede yeni b ():
java.lang.NoClassDefFoundError: a $ b
a.main (a.java:5)
Nedeni: java.lang.ClassNotFoundException: a $ b
java.net.URLClassLoader $ 1.run'da (URLClassLoader.java:200)
java.security.AccessController.doPrivileged (Yerel Yöntem)
java.net.URLClassLoader.findClass adresinde (URLClassLoader.java:188)
java.lang.ClassLoader.loadClass'ta (ClassLoader.java:307)
sun.misc.Launcher'da $ AppClassLoader.loadClass (Launcher.java:301)
java.lang.ClassLoader.loadClass'ta (ClassLoader.java:252)
java.lang.ClassLoader.loadClassInternal'da (ClassLoader.java:320)
... 1 tane daha
İkinci denemede yeni b ():
java.lang.NoClassDefFoundError: a $ b
a.main (a.java:7)
İlk çağırma, söz konusu kodun ( new b()
) çalışması gerektiğinden , denetlenmeyen bir NoClassDefFoundError içine sarılması gereken bir ClassNotFoundException özelliğiyle (sınıfı yükleyemediğinde sınıf yükleyicisi tarafından atılır) sonuçlanır .
İkinci deneme de elbette başarısız olacaktır, ancak gördüğünüz gibi sarılmış istisna artık yoktur, çünkü ClassLoader başarısız sınıf yükleyicileri hatırlıyor gibi görünüyor. Sadece NCDFE'yi gerçekten ne olduğuna dair hiçbir ipucu olmadan görüyorsunuz.
Bu nedenle, kök nedeni olmayan bir NCDFE görürseniz, hatanın nedenini bulmak için sınıfın ilk kez yüklendiğini izleyip izleyemeyeceğinizi görmeniz gerekir.
-verbose
(örn.-verbose:class -verbose:jni
) Yardımcılarıyla çalıştırmayı buluyorum - ancak mogsie, cevaplarının altında bunun yararlı bir bilgi