¿Qué causas y cuáles son las diferencias entre NoClassDefFoundError y ClassNotFoundException?

371

¿Cuál es la diferencia entre NoClassDefFoundErrory ClassNotFoundException?

¿Qué hace que sean arrojados? ¿Cómo se pueden resolver?

A menudo encuentro estos objetos arrojables al modificar el código existente para incluir nuevos archivos jar. Los golpeé tanto en el lado del cliente como en el servidor para una aplicación java distribuida a través de webstart.

Posibles razones por las que me he encontrado:

  1. paquetes no incluidos en build.xmlel lado del código del cliente
  2. faltan classpath en tiempo de ejecución para los nuevos frascos que estamos usando
  3. la versión entra en conflicto con el jar anterior

Cuando los encuentro hoy, adopto un enfoque de seguimiento y error para que las cosas funcionen. Necesito más claridad y comprensión.

krisp
fuente
A menudo encuentro que ejecutar la JVM con -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 :(
PJTraill

Respuestas:

388

La diferencia con las especificaciones API de Java es la siguiente.

Para ClassNotFoundException:

Lanzado cuando una aplicación intenta cargar en una clase a través de su nombre de cadena usando:

  • El forNamemétodo en clase Class.
  • El findSystemClassmétodo en clase ClassLoader.
  • El loadClassmétodo en clase ClassLoader.

pero no se pudo encontrar una definición para la clase con el nombre especificado.

Para NoClassDefFoundError:

Se genera si la máquina virtual Java o una ClassLoaderinstancia intenta cargar la definición de una clase (como parte de una llamada a un método normal o como parte de la creación de una nueva instancia utilizando la nueva expresión) y no se puede encontrar una definición de la clase.

La definición de clase buscada existía cuando se compiló la clase que se ejecuta actualmente, pero la definición ya no se puede encontrar.

Entonces, parece que NoClassDefFoundErrorocurre cuando la fuente se compiló con éxito, pero en tiempo de ejecución, classno se encontraron los archivos necesarios . Esto puede ser algo que puede suceder en la distribución o producción de archivos JAR, donde no classse incluyeron todos los archivos necesarios .

En cuanto a ClassNotFoundException, parece que puede provenir de intentar hacer llamadas reflexivas a las clases en tiempo de ejecución, pero las clases que el programa intenta llamar no existen.

La diferencia entre los dos es que uno es un Errory el otro es un Exception. With NoClassDefFoundErrores an Errory surge de la Java Virtual Machine que tiene problemas para encontrar una clase que esperaba encontrar. Un programa que se esperaba que funcionara en tiempo de compilación no puede ejecutarse debido a classque no se encuentran los archivos, o no es el mismo que fue producido o encontrado en tiempo de compilación. Este es un error bastante crítico, ya que el programa no puede ser iniciado por la JVM.

Por otro lado, el ClassNotFoundExceptiones un Exception, por lo que es algo esperado, y es algo recuperable. El uso de la reflexión puede ser propenso a errores (ya que hay algunas expectativas de que las cosas no salgan como se esperaba. No hay verificación en tiempo de compilación para ver que existen todas las clases requeridas, por lo que cualquier problema para encontrar las clases deseadas aparecerá en tiempo de ejecución .

Coobird
fuente
53
NoClassDefFoundErrorgeneralmente ocurre cuando hay un problema (excepción lanzada) con el bloque estático o la inicialización de los campos estáticos de la clase, por lo que la clase no se puede inicializar con éxito.
Dagang
77
voto a favor uno es un Errory el otro es un Exception. :)
Ravi
83

Se lanza una ClassNotFoundException cuando el ClassLoader no encuentra la clase informada. Esto generalmente significa que falta la clase en CLASSPATH. También podría significar que la clase en cuestión está intentando cargarse desde otra clase que se cargó en un cargador de clases padre y, por lo tanto, la clase del cargador de clases hijo no es visible. Este es a veces el caso cuando se trabaja en entornos más complejos como un servidor de aplicaciones (WebSphere es infame por tales problemas con el cargador de clases).

La gente a menudo tienden a confundir java.lang.NoClassDefFoundErrorcon java.lang.ClassNotFoundExceptionsin embargo hay una distinción importante. Por ejemplo, una excepción (un error realmente dado que java.lang.NoClassDefFoundErrores una subclase de java.lang.Error) como

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

no significa que la clase ActiveMQConnectionFactory no esté en CLASSPATH. De hecho, es todo lo contrario. Significa que ClassLoader encontró la clase ActiveMQConnectionFactory, sin embargo, al intentar cargar la clase, se encontró con un error al leer la definición de clase. Esto suele suceder cuando la clase en cuestión tiene bloques estáticos o miembros que usan una clase que ClassLoader no encuentra. Entonces, para encontrar al culpable, vea el origen de la clase en cuestión (ActiveMQConnectionFactory en este caso) y busque el código usando bloques estáticos o miembros estáticos. Si no tiene acceso a la fuente, simplemente descompílelo usando JAD.

Al examinar el código, digamos que encuentra una línea de código como la siguiente, asegúrese de que la clase SomeClass esté en su CLASSPATH.

private static SomeClass foo = new SomeClass();

Consejo: para saber a qué jar pertenece una clase, puede usar el sitio web jarFinder. Esto le permite especificar un nombre de clase utilizando comodines y busca la clase en su base de datos de jarras. jarhoo te permite hacer lo mismo pero ya no es gratis.

Si desea ubicar a qué jar pertenece una clase en una ruta local, puede usar una utilidad como jarscan ( http://www.inetfeedback.com/jarscan/ ). Simplemente especifique la clase que desea ubicar y la ruta del directorio raíz donde desea que comience a buscar la clase en archivos jar y zip.

Sanjiv Jivan
fuente
99
Es curioso que esta sea exactamente la respuesta correcta votada la última. (Incluso -1 antes de votar). ClassNotFoundException significa que CL no ve el archivo .class. NoClassDefFoundError significa que el archivo .class está allí, no se puede cargar (posiblemente un error JNI).
user43685
1
¿No es esta respuesta contradictoria con la forma de respuesta coobird?
zardosht
Intenté un ejemplo similar de bloqueo estático. Mi clase Class1 tiene una variable estática "private static B foo = new B ();" Después de la compilación, eliminé el archivo B.class de la carpeta bin. Ahora desde el método Main de tercera clase cuando creo un objeto de Class1. El rror se muestra como sigue: -------- "Excepción en el hilo" main "java.lang.NoClassDefFoundError: spring / B" ........ Así que menciona exactamente qué clase no encontró ieclass se refiere en bloque estático y no en la clase externa, por lo que es contrario a esta respuesta.
Kaushik Lele
+1 para la aclaración sobre "no significa que la clase ActiveMQConnectionFactory no esté en CLASSPATH"
akila
35

NoClassDefFoundErrorEs básicamente un error de vinculación. Se produce cuando intenta crear una instancia de un objeto (estáticamente con "nuevo") y no se encuentra cuando estaba durante la compilación.

ClassNotFoundExceptiones más general y es una excepción en tiempo de ejecución cuando intenta utilizar una clase que no existe. Por ejemplo, si tiene un parámetro en una función, acepta una interfaz y alguien pasa a una clase que implementa esa interfaz, pero no tiene acceso a la clase. También cubre el caso de carga de clase dinámica, como el uso de loadClass()o Class.forName().

cletus
fuente
29

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.

mogsie
fuente
¿Qué pasa con la ejecución de la JVM -verboseo alguna opción similar dependiendo de la JVM específica? Probablemente -verbose:class, tal vez -verbose:class:jnisi usa JNI, pero no estoy seguro de la sintaxis. Si esto es útil, quizás podría mostrar los resultados.
PJTraill
Ni -verbose:classtampoco -verbose:jnidan ningún resultado adicional relevante para la clase que falta.
mogsie
1
Gracias por probarlo, incluso si el resultado es decepcionante. (PD: desde entonces descubrí que -verbose:class:jniestá mal: uno tiene que especificar dos opciones separadas:. -verbose:class -verbose:jni)
PJTraill
2
La última oración * 1,000,000: 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.
Batwad
20

De http://www.javaroots.com/2013/02/classnotfoundexception-vs.html :

ClassNotFoundException: ocurre cuando el cargador de clases no pudo encontrar la clase requerida en la ruta de clase. Entonces, básicamente, debe verificar su ruta de clase y agregar la clase en la ruta de clase.

NoClassDefFoundError: esto es más difícil de depurar y encontrar la razón. Esto se produce cuando en el momento de la compilación están presentes las clases requeridas, pero en el tiempo de ejecución las clases se cambian o eliminan o las inicializaciones estáticas de la clase arrojan excepciones. Significa que la clase que se está cargando está presente en classpath, pero una de las clases que requiere esta clase se elimina o el compilador no puede cargarla. Entonces debería ver las clases que dependen de esta clase.

Ejemplo :

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

Ahora, después de compilar ambas clases, si elimina el archivo Test1.class y ejecuta Test class, arrojará

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

ClassNotFoundException: se lanza cuando una aplicación intenta cargarse en una clase a través de su nombre, pero no se pudo encontrar una definición para la clase con el nombre especificado.

NoClassDefFoundError: arrojado si la máquina virtual Java intenta cargar la definición de una clase y no se puede encontrar ninguna definición de la clase.

KingFeming
fuente
¿Qué pasa con la ejecución de la JVM -verboseo alguna opción similar dependiendo de la JVM específica? Probablemente -verbose:class, tal vez -verbose:class:jnisi usa JNI, pero no estoy seguro de la sintaxis.
PJTraill
-verbose:class:jniestá mal, pero se pueden pasar dos opciones diferentes: -verbose:class -verbose:jni.
PJTraill
15

¿Cuál es la razón para obtener cada uno de ellos y algún proceso de pensamiento sobre cómo lidiar con tales errores?

Están estrechamente relacionados. Se ClassNotFoundExceptionlanza A cuando Java fue a buscar una clase particular por su nombre y no pudo cargarla con éxito. Se NoClassDefFoundErrorarroja una A cuando Java fue a buscar una clase que estaba vinculada a algún código existente, pero no pudo encontrarla por una razón u otra (por ejemplo, ruta de clase incorrecta, versión incorrecta de Java, versión incorrecta de una biblioteca) y es completamente fatal ya que indica que algo salió mal.

Si tiene antecedentes de C, un CNFE es como un fallo en dlopen()/ dlsym()y un NCDFE es un problema con el enlazador; en el segundo caso, los archivos de clase en cuestión nunca deberían haberse compilado realmente en la configuración que está tratando de usar.

Compañeros de Donal
fuente
11

Ejemplo 1:

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

Si com/example/Class1no existe en ninguno de los classpaths, arroja ClassNotFoundException.

Ejemplo # 2:

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

Si com/example/Class2existió mientras compilaba B, pero no se encontró durante la ejecución, entonces se arroja NoClassDefFoundError.

Ambas son excepciones de tiempo de ejecución.

Dinesh
fuente
9

Se produce ClassNotFoundException cuando se intenta cargar la clase haciendo referencia a ella a través de una Cadena. Por ejemplo, el parámetro en Class.forName () es una cadena, y esto aumenta el potencial de que se pasen nombres binarios no válidos al cargador de clases.

La excepción ClassNotFoundException se produce cuando se encuentra un nombre binario potencialmente inválido; por ejemplo, si el nombre de la clase tiene el carácter '/', seguramente obtendrá una ClassNotFoundException. También se produce cuando la clase a la que se hace referencia directamente no está disponible en el classpath.

Por otro lado, se lanza NoClassDefFoundError

  • cuando la representación física real de la clase: el archivo .class no está disponible,
  • o la clase ya se ha cargado en un cargador de clases diferente (por lo general, un cargador de clases padre habría cargado la clase y, por lo tanto, la clase no se puede volver a cargar),
  • o si se ha encontrado una definición de clase incompatible: el nombre en el archivo de clase no coincide con el nombre solicitado,
  • o (lo más importante) si una clase dependiente no se puede ubicar y cargar. En este caso, la clase a la que se hace referencia directamente podría haberse ubicado y cargado, pero la clase dependiente no está disponible o no se puede cargar. Este es un escenario en el que la clase a la que se hace referencia directamente se puede cargar a través de Class.forName o métodos equivalentes. Esto indica una falla en el enlace.

En resumen, un NoClassDefFoundError generalmente se genera en declaraciones () o invocaciones de métodos que cargan una clase previamente ausente (a diferencia de la carga de clases basada en cadenas para ClassNotFoundException), cuando el cargador de clases no puede encontrar o cargar la definición de clase ( s)

Finalmente, corresponde a la implementación de ClassLoader lanzar una instancia de ClassNotFoundException cuando no puede cargar una clase. La mayoría de las implementaciones de cargadores de clases personalizadas realizan esto ya que extienden el URLClassLoader. Por lo general, los cargadores de clases no arrojan explícitamente un NoClassDefFoundError en ninguna de las implementaciones de métodos; esta excepción generalmente se produce desde la JVM en el compilador HotSpot, y no por el cargador de clases en sí.

Vineet Reynolds
fuente
Voto a favor por mencionar 'el nombre en el archivo de clase no coincide con el nombre solicitado'. Esta es una causa bastante común.
Marqués de Lorne
8

Diferencia entre ClassNotFoundException Vs NoClassDefFoundError

ingrese la descripción de la imagen aquí

Lawakush Kurmi
fuente
No es claro como el cristal. "No actualizado en el classpath" es vago / impreciso. Esto se trata de que el JAR no esté presente en el classpath o que la versión incorrecta del JAR esté en el classpath. Y errores de ortografía. Y (suspiro) ya que publicaste tu información como un gráfico funky, no podemos solucionarlo.
Stephen C
8

Con los nombres en sí podemos identificar fácilmente uno de Exceptiony otro es de Error.

Excepción: se producen excepciones durante la ejecución del programa. Un programador puede manejar estas excepciones al intentar bloquear el bloque. Tenemos dos tipos de excepciones. Excepción marcada que arroja en tiempo de compilación. Excepciones de tiempo de ejecución que se generan en tiempo de ejecución, estas excepciones generalmente ocurren debido a una mala programación.

Error: estas no son excepciones en absoluto, está más allá del alcance del programador. Estos errores generalmente los arroja JVM.


ingrese la descripción de la imagen aquí fuente de imagen

Diferencia:

ClassNotFoundException:

  • El cargador de clases no puede verificar un código de bytes de clase que mencionamos en la fase de enlace del subsistema de carga de clases que obtenemos ClassNotFoundException.
  • ClassNotFoundExceptiones una excepción marcada derivada directamente de la java.lang.Exceptionclase y debe proporcionar un manejo explícito
  • ClassNotFoundExceptionaparece cuando hay una carga explícita de clase involucrada al proporcionar el nombre de la clase en tiempo de ejecución usando ClassLoader.loadClass (), Class.forName () y ClassLoader.findSystemClass ().

No Error Clase Def Encontrado:

  • El cargador de clases no resuelve las referencias de una clase en la fase de enlace del subsistema de carga de clases que obtenemos NoClassDefFoundError.
  • NoClassDefFoundErrores un error derivado de la LinkageErrorclase, que se utiliza para indicar casos de error, donde una clase depende de otra clase y esa clase ha cambiado de manera incompatible después de la compilación.
  • NoClassDefFoundErrores el resultado de la carga implícita de la clase debido a una llamada al método desde esa clase o cualquier acceso variable.

Similitudes:

  • Ambos NoClassDefFoundErrory ClassNotFoundExceptionestán relacionados con la falta de disponibilidad de una clase en tiempo de ejecución.
  • Ambos ClassNotFoundExceptiony NoClassDefFoundErrorestán relacionados con Java classpath.
Premraj
fuente
3

Dadas las acciones del subsistema del cargador de clases:

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

Este es un artículo que me ayudó mucho a comprender la diferencia: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

Si se produce un error durante la carga de la clase, se debe lanzar una instancia de una subclase de LinkageError en un punto del programa que (directa o indirectamente) usa la clase o la interfaz que se está cargando.

Si la Máquina virtual Java alguna vez intenta cargar una clase C durante la verificación (§5.4.1) o la resolución (§5.4.3) (pero no la inicialización (§5.5)), y el cargador de clases que se utiliza para iniciar la carga de C lanza una instancia de ClassNotFoundException , luego la máquina virtual Java debe lanzar una instancia de NoClassDefFoundError cuya causa es la instancia de ClassNotFoundException .

Entonces, una ClassNotFoundException es una causa raíz de NoClassDefFoundError .
Y un NoClassDefFoundError es un caso especial de error de carga de tipo, que ocurre en el paso Vinculación .

Anton Shchastnyi
fuente
2

Agregue una posible razón en la práctica:

  • ClassNotFoundException: como dijo cletus, usa la interfaz mientras la clase heredada de la interfaz no está en el classpath. Por ejemplo, el patrón de proveedor de servicios (o localizador de servicios ) intenta ubicar alguna clase no existente
  • NoClassDefFoundError: se encuentra la clase dada mientras no se encuentra la dependencia de la clase dada

En la práctica, el error se puede lanzar silenciosamente , por ejemplo, envía una tarea de temporizador y en la tarea de temporizador arroja error , mientras que en la mayoría de los casos, su programa solo detecta la excepción . Luego, el ciclo principal del temporizador finaliza sin ninguna información. Un error similar a NoClassDefFoundError es ExceptionInInitializerError , cuando su inicializador estático o el inicializador de una variable estática arroja una excepción.

Leef
fuente
1

ClassNotFoundException es una excepción comprobada que ocurre cuando le decimos a JVM que cargue una clase por su nombre de cadena usando los métodos Class.forName () o ClassLoader.findSystemClass () o ClassLoader.loadClass () y la clase mencionada no se encuentra en el classpath.

La mayoría de las veces, esta excepción ocurre cuando intenta ejecutar una aplicación sin actualizar el classpath con los archivos JAR requeridos. Por ejemplo, es posible que haya visto esta excepción al hacer el código JDBC para conectarse a su base de datos, es decir, MySQL, pero su classpath no tiene JAR para ello.

El error NoClassDefFoundError ocurre cuando JVM intenta cargar una clase particular que es parte de la ejecución de su código (como parte de una llamada a método normal o como parte de crear una instancia usando la nueva palabra clave) y esa clase no está presente en su classpath pero estaba presente en el momento de la compilación porque para ejecutar su programa necesita compilarlo y si está intentando usar una clase que no está presente, el compilador generará un error de compilación.

A continuación se muestra la breve descripción.

ingrese la descripción de la imagen aquí

Puede leer Everything About ClassNotFoundException Vs NoClassDefFoundError para obtener más detalles.

Naresh Joshi
fuente
0

Me recuerdo lo siguiente una y otra vez cuando necesito actualizar

ClassNotFoundException

Jerarquía de clase

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Mientras se depura

  1. Jar requerido, falta clase en el classpath.
  2. Verifique que todos los archivos jar necesarios estén en classpath de jvm.

No Error Clase Def Encontrado

Jerarquía de clase

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Mientras se depura

  1. Problema con la carga dinámica de una clase, que se compiló correctamente
  2. Problema con bloques estáticos, constructores, métodos init () de clase dependiente y el error real está envuelto por múltiples capas [especialmente cuando usa spring, hibernate, la excepción real está envuelta y obtendrá NoClassDefError]
  3. Cuando enfrenta "ClassNotFoundException" bajo un bloque estático de clase dependiente
  4. Problema con versiones de clase. Esto sucede cuando tiene dos versiones v1, v2 de la misma clase en diferentes jar / paquetes, que se compiló con éxito usando v1 y v2 se carga en el tiempo de ejecución que no tiene los métodos / vars relevantes y verá esta excepción. [Una vez resolví este problema eliminando el duplicado de la clase relacionada log4j en varios tarros que aparecían en el classpath]
Sankarganesh Eswaran
fuente
-1

ClassNotFoundException y NoClassDefFoundError ocurren cuando una clase particular no se encuentra en tiempo de ejecución, sin embargo, ocurren en diferentes escenarios.

ClassNotFoundException es una excepción que ocurre cuando intenta cargar una clase en tiempo de ejecución utilizando los métodos Class.forName () o loadClass () y las clases mencionadas no se encuentran en el classpath.

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }



    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

NoClassDefFoundError es un error que ocurre cuando una clase particular está presente en tiempo de compilación, pero faltaba en tiempo de ejecución.

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

Cuando compila el programa anterior, se generarán dos archivos .class. Uno es A.class y otro es B.class. Si elimina el archivo A.class y ejecuta el archivo B.class, Java Runtime System arrojará NoClassDefFoundError como a continuación:

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Neeraj Gahlawat
fuente