hilos - metodo wait java ejemplo
Si un NoClassDefFoundError es causado por una excepción ClassNotFoundException, ¿por qué Java espera que usted atrape ambos objetos de tiro? (5)
Cuando ejecuto este código, la aplicación se cierra con una excepción ClassNotFoundException:
//uncaught ClassNotFoundException
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (NoClassDefFoundError e)
{
}
Cuando intento compilar este código, el compilador se queja de que no se puede acceder a la excepción ClassNotFoundException porque no se lanza dentro de la cláusula try de la instrucción try-catch.
//Won''t compile
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (ClassNotFoundException e)
{
}
Cuando ejecuto este código, el único archivo que se puede capturar es un NoClassDefFoundError.
//catches throwable of type java.lang.NoClassDefFoundError,
//with a java.lang.ClassNotFoundException as its cause
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (Throwable e)
{
System.out.println(e.getClass().getName());
System.out.println(e.getCause().getClass().getName());
}
El siguiente código compilará y detectará el error (y solo el error), pero es torpe:
//possible workaround
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
if (1 == 0) throw new ClassNotFoundException(); // we want the code to compile
}
catch (ClassNotFoundException e)
{
System.out.println("ex");
}
catch (NoClassDefFoundError e)
{
System.out.println("err");
}
Y sin embargo, cuando escribo lo siguiente, puedo escapar sin una cláusula de captura para la causa del error:
//and yet this works just fine...
try
{
throw new Error(new IOException());
}
catch (Error e)
{
System.out.println("err");
}
El ejemplo 3 me llevaría a la conclusión de que el objeto de lanzamiento era un NoClassDefFoundError. El ejemplo 1 me llevaría a la conclusión de que el objeto de lanzamiento era una excepción ClassNotFoundException. Y, sin embargo, el ejemplo 2 muestra que Java ni siquiera me permite escribir código para capturar correctamente la excepción ClassNotFoundException.
Justo cuando estaba a punto de concluir que el problema aquí es el error causado por una excepción, ejecuté el código que se muestra en el ejemplo anterior que muestra que esa no es la regla.
¿Puede alguien explicar por favor lo que está pasando aquí?
PD: esta es la traza de pila:
java.lang.NoClassDefFoundError: com/my/pckage/MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at Main$MyClassLoader.getClasses(Main.java:78)
at Main.main(Main.java:109)
Caused by: java.lang.ClassNotFoundException: com.my.pckage.MyClass
at java.lang.ClassLoader.findClass(ClassLoader.java:522)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 4 more
Como ya se ha señalado, Java no le permitirá manejar los errores.
De todos modos, no estoy realmente seguro de cuáles son sus razones para tratar de evitar estas excepciones (y errores), pero estos son los casos en los que los programadores no tienen que preocuparse (la mayoría de las veces). Para mí, este es un síntoma de que hay un problema en otra parte de su código / proyecto. Si el sistema lanza una ClassNotFoundException
y le permite capturarlo, ¿cómo lo manejaría? ¿O preferiría abordar el problema real que una determinada clase requerida por su aplicación no está en la ruta de clase?
Además, es posible que desee verificar la diferencia entre NoClassDefFoundError y ClassNotFoundException para resolver mejor su problema.
Entonces, estás malinterpretando el rastro de tu pila.
java.lang.NoClassDefFoundError: com/my/package/MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at Main$MyClassLoader.getClasses(Main.java:78)
at Main.main(Main.java:109)
Caused by: java.lang.ClassNotFoundException: com.my.package.MyClass
Su código está generando un NoClassDefFoundError
. La causa subyacente es una ClassNotFoundException
. Recuerde que la cause
es una propiedad de la clase Throwable, y que al imprimir stacktraces, Java mostrará información sobre la excepción directa y su (s) causa (s) subyacente (s). Es más difícil decir por qué el método de define
está fallando internamente, pero una cosa es segura: no puede usar el package
palabras clave en el nombre de un paquete.
NoClassDefFoundError ocurre cuando se encuentra .class para una clase, pero la clase no se puede construir a partir de esa .class.
Hay varios escenarios diferentes que ocurren comúnmente, más algunos más oscuros.
- El archivo .class contiene un nombre (y paquete) que no coincide con el nombre / paquete del archivo de clase
- No se pudo encontrar una clase que fue necesaria para verificar e inicializar la clase
- Se produjo un error durante la inicialización de la clase.
En la mayoría de estos escenarios, hay otro error o excepción que ocurre antes, es capturado por el cargador de clases y se señala el nuevo error.
No está claro exactamente qué escenario está ocurriendo en el rastreo de excepciones anterior, pero supongo que hay algún tipo de falta de coincidencia de nombres.
NoClassDefFoundError
es en realidad una subclase de Error
y no se deben detectar. Vea los documentos de error para más detalles. La nota importante a continuación:
Un error es una subclase de Throwable que indica problemas graves que una aplicación razonable no debería intentar detectar. La mayoría de estos errores son condiciones anormales.
No se requiere que un método declare en su cláusula de lanzamiento ninguna subclase de Error que se pueda lanzar durante la ejecución del método pero que no se detecte, ya que estos errores son condiciones anormales que nunca deberían ocurrir.
Por esta razón, creo que deberías echar un vistazo más de cerca a tu código para ver qué estás haciendo mal.
//and yet this works just fine...
try
{
throw new Error(new IOException());
}
catch (Error e)
{
System.out.println("err");
}
Reemplácelo con:
//and yet this still works fine...
try
{
throw new NoClassDefFoundError(new ClassNotFoundException());
}
catch (Error e)
{
System.out.println("err");
}
Pruebe un e.printStackTrace () y verá un resultado similar.