2010-07-15 18 views
6

NoClassDefFoundError extiende LinkageError que a su vez extiende Error.Diferencias entre NoClassDefFoundError y ClassNotFoundException?

Javadoc para estados clase de error:

Un Error es una subclase de Throwable que indica serios problemas que una aplicación razonable no debe tratar de atrapar.

Los métodos de carga de clases como Class.forName() solo declaran ClassNotFoundException en cláusula throws. El cual, además de la descripción anterior de Error significa que no hay que ser por lo general la captura de los NoClassDefFoundError clases cuando se carga con Class.forName() etc.

Mi pregunta es ¿cuáles son las condiciones en las que NoClassDefFoundError se lanza en lugar de ClassNotFoundException?

+0

Duplicado exacto de http://stackoverflow.com/questions/1457863/what-is-the-difference-between-noclassdeffounderror-and-classnotfoundexception – skaffman

+0

También encontré una discusión relacionada aquí: http://stackoverflow.com/ preguntas/430089/in-java-can-class-forname-ever-return-null/430092 # 430092 –

Respuesta

12

ClassNotFoundException es más probable que sea lanzado (a su código) en situaciones en las que está cargando manualmente clases - precisamente por cosas como Class.forName(). Estos nombres pueden provenir de la entrada del usuario, por ejemplo.

NoClassDefFoundError se producirá cuando un archivo de clase se refiere a una clase que no se puede encontrar. La clase era presente en algún momento, pero ahora no lo es, no se trata solo de un error en el código que está tratando de hacer la reflexión, es un error de implementación al no hacer disponibles todas las clases requeridas. Por lo que puedo decir, NoClassDefFoundError generalmente o posiblemente siempre envuelve a ClassNotFoundException - pero el punto es que esto no es algo su código está destinado a proteger, ya que indica un entorno que probablemente está demasiado roto para Recuperarse de.

Al menos, esa es mi comprensión :)

+2

@Downvoter: ¿Le gustaría decir por qué? –

+1

Hay otra pregunta mucho más valorada para esto, con respuestas mejor calificadas, pero sentí que esta respuesta lo explicó mejor y me dio información que faltaba de los demás. (Como la observación de que NoClassDefFoundError parece envolver siempre ClassNotFoundException, lo que aclara mucho sobre la intención de estas dos clases). – skiphoppy

+0

@Jon ¿Puede dar un ejemplo práctico de cuándo los nombres de las clases provienen de la entrada del usuario? – Geek

0

NoClassDefFoundError occures en tiempo de ejecución porque el compilador no es capaz de encontrar el archivo .class.