Un NoClassDefFoundError (NCDFE) ocurre cuando su código ejecuta "new Y ()" y no puede encontrar la clase Y.
Puede ser simplemente que falta su Y en su cargador de clases como sugieren los otros comentarios, pero podría ser que la clase Y no está firmada o tiene una firma no válida, o que Y está cargado por un cargador de clases diferente que no está visible para su código , o incluso que Y depende de Z que no se pudo cargar por ninguno de los motivos anteriores.
Si esto sucede, la JVM recordará el resultado de cargar X (NCDFE) y simplemente lanzará un nuevo NCDFE cada vez que solicite Y sin decirle por qué:
clase A {
clase estática b {}
public static void main (String args []) {
System.out.println ("Primer intento nuevo b ():");
pruebe {new b (); } catch (Throwable t) {t.printStackTrace ();}
System.out.println ("\ nSegundo intento nuevo b ():");
pruebe {new b (); } catch (Throwable t) {t.printStackTrace ();}
}
}
guarda esto como a.java en alguna parte
El código simplemente intenta crear una instancia de una nueva clase "b" dos veces, aparte de eso, no tiene ningún error y no hace nada.
Compile el código con javac a.java
, luego ejecute a invocando java -cp . a
: solo debe imprimir dos líneas de texto y debe funcionar bien sin errores.
Luego elimine el archivo "a $ b.class" (o llénelo con basura, o copie a.class sobre él) para simular la clase faltante o corrupta. Esto es lo que pasa:
Primer intento nuevo b ():
java.lang.NoClassDefFoundError: a $ b
en a.main (a.java:5)
Causado por: java.lang.ClassNotFoundException: a $ b
en java.net.URLClassLoader $ 1.run (URLClassLoader.java:200)
en java.security.AccessController.doPrivileged (Método nativo)
en java.net.URLClassLoader.findClass (URLClassLoader.java:188)
en java.lang.ClassLoader.loadClass (ClassLoader.java:307)
en sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
en java.lang.ClassLoader.loadClass (ClassLoader.java:252)
en java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... 1 más
Segundo intento nuevo b ():
java.lang.NoClassDefFoundError: a $ b
en a.main (a.java:7)
La primera invocación resulta en una ClassNotFoundException (lanzada por el cargador de clases cuando no puede encontrar la clase), que debe estar envuelta en un NoClassDefFoundError no verificado, ya que el código en cuestión ( new b()
) debería funcionar.
Por supuesto, el segundo intento también fallará, pero como puede ver, la excepción envuelta ya no existe, porque el ClassLoader parece recordar los cargadores de clases fallidos. Solo ve el NCDFE sin absolutamente ninguna idea de lo que realmente sucedió.
Entonces, si alguna vez ve un NCDFE sin causa raíz, debe ver si puede rastrear hasta la primera vez que se cargó la clase para encontrar la causa del error.
-verbose
(p-verbose:class -verbose:jni
. Ej. ) Ayuda, pero los informes de Mogsie debajo de su respuesta dicen que esto no proporciona información adicional útil :(