wrong name java classpath noclassdeffounderror classnotfoundexception

java - name - ¿Cuáles son las causas y cuáles son las diferencias entre NoClassDefFoundError y ClassNotFoundException?



java.lang.noclassdeffounderror wrong name (15)

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

Están estrechamente relacionados. Se lanza una ClassNotFoundException cuando Java buscó una clase en particular por nombre y no pudo cargarla con éxito. Se NoClassDefFoundError un NoClassDefFoundError cuando Java buscó una clase que estaba vinculada a algún código existente, pero no pudo encontrarlo por una razón u otra (por ejemplo, classpath incorrecto, versión incorrecta de Java, versión incorrecta de una biblioteca) y es completamente fatal, ya que indica que algo ha ido muy mal.

Si tiene un fondo en C, un CNFE es como una falla 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 haber sido compilados realmente en la configuración que está intentando usar.

¿Cuál es la diferencia entre NoClassDefFoundError y ClassNotFoundException ?

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

A menudo encuentro estos objetos desechables cuando modifico el código existente para incluir nuevos archivos jar. Los he golpeado tanto en el lado del cliente como en el servidor para una aplicación java distribuida a través de webstart.

Posibles razones que he encontrado:

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

Cuando me encuentro con estos hoy tomo un enfoque de sendero y error para que las cosas funcionen. Necesito más claridad y comprensión.


Con los nombres en sí, podemos identificar fácilmente uno de Exception y otro de Error .

Excepción: se producen excepciones durante la ejecución del programa. Un programador puede manejar estas excepciones probando el bloque catch. Tenemos dos tipos de excepciones. Excepción marcada que lanza en tiempo de compilación. Excepciones de tiempo de ejecución que se lanzan 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 son generalmente lanzados por JVM.

fuente de imagen

Diferencia:

ClassNotFoundException:

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

No Error Clase Def Encontrado:

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

Similitudes:

  • Tanto NoClassDefFoundError como ClassNotFoundException están relacionadas con la falta de disponibilidad de una clase en tiempo de ejecución.
  • Tanto ClassNotFoundException como NoClassDefFoundError están relacionados con la ruta de NoClassDefFoundError de Java.

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

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

En la práctica, el error puede ser lanzado en silencio , por ejemplo, envía una tarea de temporizador y en la tarea de temporizador arroja un error , mientras que en la mayoría de los casos, su programa solo detecta Excepción . Entonces el bucle principal del temporizador se termina sin ninguna información. Un error similar a NoClassDefFoundError es ExceptionInInitializerError , cuando su inicializador estático o el inicializador para una variable estática lanza una excepción.


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 se produce 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 la ruta de clase.

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 se produce cuando una clase en particular está presente en el momento de la compilación, pero faltaba en el tiempo de ejecución.

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

Cuando compile 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 lanzará 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)


Dadas las acciones de sussistema del cargador de clases:

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) utiliza 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 de Java debe lanzar una instancia de NoClassDefFoundError cuya causa es la instancia de ClassNotFoundException .

Entonces, una excepción 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 de Enlace .


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 clases. Entonces, básicamente, deberías verificar tu ruta de clase y agregar la clase en la ruta de clases.

NoClassDefFoundError : esto es más difícil de depurar y encontrar la razón. Esto se produce cuando en tiempo de compilación las clases requeridas están presentes, pero en el tiempo de ejecución las clases se cambian o eliminan o la clase estática inicializa las excepciones lanzadas. Significa que la clase que se está cargando está presente en classpath, pero una de las clases requeridas por esta clase es eliminada o el compilador no pudo cargarla. Así que deberías 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 la clase Test, lanzará

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 cargar 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 : se lanza si la máquina virtual de Java intenta cargar en la definición de una clase y no se puede encontrar ninguna definición de la clase.


Diferencia entre ClassNotFoundException Vs NoClassDefFoundError


Ejemplo 1:

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

Si com/example/Class1 no existe en ninguna de las classpaths, entonces lanza ClassNotFoundException .

Ejemplo # 2:

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

Si com/example/Class2 existía al compilar B, pero no se encontró durante la ejecución, entonces arroja NoClassDefFoundError .

Ambos son excepciones de tiempo de ejecución.


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

Para ClassNotFoundException :

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

  • El método forName en la clase de Class .
  • El método findSystemClass en la clase ClassLoader .
  • El método loadClass en la clase ClassLoader .

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

Para NoClassDefFoundError :

Se lanza si la instancia de Java Virtual Machine o ClassLoader intenta cargar en la definición de una clase (como parte de una llamada de método normal o como parte de la creación de una nueva instancia usando 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.

Por lo tanto, parece que NoClassDefFoundError ocurre cuando la fuente se compiló exitosamente, pero en tiempo de ejecución, no se encontraron los archivos de class requeridos. Esto puede ser algo que puede suceder en la distribución o producción de archivos JAR, donde no se incluyeron todos los archivos de class requeridos.

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

La diferencia entre los dos es que uno es un Error y el otro es una Exception . Con NoClassDefFoundError es un Error y surge de la máquina virtual de Java que tiene problemas para encontrar la clase que esperaba encontrar. Un programa que se esperaba que funcionara en tiempo de compilación no se puede ejecutar debido a que no se encontraron archivos de class , o no es el mismo que se produjo o encontró 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, la Exception ClassNotFoundException es una Exception , por lo que es algo esperado y es algo recuperable. El uso de la reflexión puede ser propenso a errores (ya que existe la expectativa de que las cosas no vayan como se esperaba. No hay una verificación en tiempo de compilación para ver si existen todas las clases requeridas, por lo que cualquier problema con la búsqueda de las clases deseadas aparecerá en el tiempo de ejecución .


Me recuerdo lo siguiente una y otra vez cuando necesito actualizar

ClassNotFoundException

Jerarquía de clases

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Mientras se depura

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

No Error Clase Def Encontrado

Jerarquía de clases

NoClassDefFoundError extends LinkageError extends Error extends Throwable

Mientras se depura

  1. Problema con cargar una clase dinámicamente, que fue compilada correctamente
  2. El problema con los bloques estáticos, los constructores, los métodos init () de la clase dependiente y el error real se envuelve en varias capas [especialmente cuando se usa Spring, hibernate, la excepción real se envuelve y obtendrá NoClassDefError]
  3. Cuando te enfrentas a "ClassNotFoundException" bajo un bloque estático de clase dependiente
  4. Problema con las versiones de clase. Esto sucede cuando tiene dos versiones v1, v2 de la misma clase en diferentes jar / packages, que se compilaron exitosamente 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 archivos jar que aparecían en el classpath]

NoClassDefFoundError es básicamente un error de vinculación. Ocurre cuando intentas crear una instancia de un objeto (estáticamente con "nuevo") y no se encuentra cuando fue durante la compilación.

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


Se lanza una excepción ClassNotFoundException cuando ClassLoader no encuentra la clase informada. Esto normalmente significa que la clase falta en la CLASSPATH. También podría significar que la clase en cuestión está tratando de cargarse desde otra clase que se cargó en un cargador de clases principal y, por lo tanto, la clase del cargador de clases secundario 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 tiende a confundir java.lang.NoClassDefFoundError con java.lang.ClassNotFoundException sin embargo, hay una distinción importante. Por ejemplo, una excepción (un error realmente desde que java.lang.NoClassDefFoundError es 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 el ClassLoader encontró la clase ActiveMQConnectionFactory; sin embargo, al intentar cargar la clase, se encontró con un error al leer la definición de la clase. Esto suele suceder cuando la clase en cuestión tiene bloques o miembros estáticos que utilizan una Clase que ClassLoader no ha encontrado. Entonces, para encontrar al culpable, vea la fuente 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ílela con JAD.

Al examinar el código, digamos que encuentra una línea de código como la que se muestra a continuación, asegúrese de incluir la clase SomeClass en su CLASSPATH.

private static SomeClass foo = new SomeClass();

Consejo: para averiguar a qué tarro pertenece una clase, puede usar el sitio web jarFinder. Esto le permite especificar un nombre de clase usando comodines y busca la clase en su base de datos de tarros. jarhoo te permite hacer lo mismo pero ya no es de uso gratuito.

Si desea ubicar a qué tarro 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.


Un NoClassDefFoundError (NCDFE) ocurre cuando su código ejecuta "nueva Y ()" y no puede encontrar la clase Y.

Simplemente puede ser que falte Y de su cargador de clases como lo sugieren otros comentarios, pero podría ser que la clase Y no esté firmada o tenga una firma no válida, o que Y esté cargada por un cargador de clases diferente que no sea visible para su código , o incluso esa Y depende de Z que no pudo cargarse por ninguna de las razones anteriores.

Si esto sucede, la JVM recordará el resultado de la carga de X (NCDFE) y simplemente lanzará una nueva NCDFE cada vez que solicite Y sin decirle por qué:

class a { static class b {} public static void main(String args[]) { System.out.println("First attempt new b():"); try {new b(); } catch(Throwable t) {t.printStackTrace();} System.out.println("/nSecond attempt new b():"); try {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 java -cp . a - solo debería imprimir dos líneas de texto, y debería 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 dañada. Esto es lo que sucede:

First attempt new b(): java.lang.NoClassDefFoundError: a$b at a.main(a.java:5) Caused by: java.lang.ClassNotFoundException: a$b at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at 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 more Second attempt new b(): java.lang.NoClassDefFoundError: a$b at a.main(a.java:7)

La primera invocación da como resultado una excepción ClassNotFoundException (lanzada por el cargador de clases cuando no puede encontrar la clase), que debe estar envuelta en un NoClassDefFoundError sin marcar, ya que el código en cuestión ( new b() ) debería funcionar.

Por supuesto, el segundo intento también fracasará, pero como puede ver, la excepción envuelta ya no es más, ya que el ClassLoader parece recordar los cargadores de clases fallidos. Solo ves la NCDFE sin ninguna pista de lo que realmente sucedió.

Entonces, si alguna vez ve un NCDFE sin causa raíz, necesita ver si puede rastrear hasta la primera vez que se cargó la clase para encontrar la causa del error.


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

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

Por otro lado, NoClassDefFoundError es lanzado

  • cuando la representación física real de la clase - el archivo .class no está disponible,
  • o la clase ya se cargó 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 localizado y cargado, pero la clase dependiente no está disponible o no se puede cargar. Este es un escenario donde la clase a la que se hace referencia directamente se puede cargar a través de un Class.forName o métodos equivalentes. Esto indica una falla en el enlace.

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

Finalmente, depende de 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 clase personalizados realizan esto ya que extienden el URLClassLoader. Por lo general, los cargadores de clases no lanzan explícitamente un NoClassDefFoundError en ninguna de las implementaciones de métodos: esta excepción generalmente se lanza desde la JVM en el compilador HotSpot, y no por el propio cargador de clases.


ClassNotFoundException es una excepción marcada que ocurre cuando le pedimos 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 la ruta de clase.

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

El error NoClassDefFoundError se produce cuando JVM intenta cargar una clase particular que es parte de la ejecución del código (como parte de una llamada de método normal o como parte de la creación de una instancia usando la nueva palabra clave) y esa clase no está presente en su ruta de clase, pero presente en tiempo de 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.

Puede leer Todo sobre ClassNotFoundException Vs NoClassDefFoundError para más detalles.