Un NoClassDefFoundError (NCDFE) si verifica quando il codice esegue "new Y ()" e non riesce a trovare la classe Y.
È possibile che Y non sia presente nel programma di caricamento della classe come suggerito dagli altri commenti, ma potrebbe essere che la classe Y non sia firmata o abbia una firma non valida o che Y sia caricato da un programma di caricamento classi diverso non visibile al codice , o anche che Y dipende da Z che non può essere caricato per nessuno dei motivi di cui sopra.
Se ciò accade, JVM ricorderà il risultato del caricamento di X (NCDFE) e lancerà semplicemente un nuovo NCDFE ogni volta che chiederai Y senza dirti perché:
classe A {
classe statica b {}
public static void main (String args []) {
System.out.println ("Primo tentativo nuovo b ():");
provare {new b (); } catch (Throwable t) {t.printStackTrace ();}
System.out.println ("\ nSecondo tentativo nuovo b ():");
provare {new b (); } catch (Throwable t) {t.printStackTrace ();}
}
}
salvalo come a.java da qualche parte
Il codice tenta semplicemente di creare un'istanza di una nuova classe "b" due volte, a parte questo, non ha alcun bug e non fa nulla.
Compila il codice con javac a.java
, quindi esegui un invocando java -cp . a
: dovrebbe solo stampare due righe di testo e dovrebbe funzionare correttamente senza errori.
Quindi eliminare il file "a $ b.class" (o riempirlo con immondizia o copiare a.class su di esso) per simulare la classe mancante o danneggiata. Ecco cosa succede:
Primo tentativo nuovo b ():
java.lang.NoClassDefFoundError: a $ b
a a.main (a.java:5)
Causato da: java.lang.ClassNotFoundException: a $ b
su java.net.URLClassLoader $ 1.run (URLClassLoader.java:200)
at java.security.AccessController.doPrivileged (metodo nativo)
su java.net.URLClassLoader.findClass (URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass (ClassLoader.java:307)
at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
at java.lang.ClassLoader.loadClass (ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... 1 altro
Secondo tentativo nuovo b ():
java.lang.NoClassDefFoundError: a $ b
a a.main (a.java:7)
La prima chiamata ha come risultato ClassNotFoundException (generata dal programma di caricamento classi quando non riesce a trovare la classe), che deve essere racchiusa in un NoClassDefFoundError non selezionato, poiché il codice in questione ( new b()
) dovrebbe funzionare.
Naturalmente anche il secondo tentativo fallirà, ma come puoi vedere l'eccezione racchiusa non è più, perché ClassLoader sembra ricordare caricatori di classi falliti. Vedi solo l'NCDFE senza assolutamente indizi su cosa sia realmente successo.
Quindi, se vedi mai un NCDFE senza causa principale, devi vedere se riesci a risalire alla prima volta in cui la classe è stata caricata per trovare la causa dell'errore.
-verbose
(es.-verbose:class -verbose:jni
) Aiuti - ma mogsie riporta sotto la loro risposta che questo non fornisce ulteriori informazioni utili :(