2009-09-03 15 views
32

¿Por qué algunas excepciones en Java no son detectadas por catch (Exception ex)? Este es un código que falla completamente con una excepción no controlada. (Java Versión 1.4).Excepción de Java no detectada

public static void main(String[] args) { 
    try { 
     //Code ... 
    } catch (Exception ex) { 
     System.err.println("Caught Exception"); 
     ex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } 
    finally { 
     app.shutdown(); 
    } 
    System.exit(exitCode); 
} 

me siento un Exception in thread "main" java.lang.NoSuchMethodError

Pero esto funciona

public static void main(String[] args) { 
    int exitCode = app.SUCCESS_EXIT_CODE; 
    try { 
     //Code ... 
    } catch (java.lang.NoSuchMethodError mex){ 
     System.err.println("Caught NoSuchMethodError"); 
     mex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } catch (Exception ex) { 
     System.err.println("Caught Exception"); 
     ex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } 
    finally { 
     app.shutdown(); 
    } 
    System.exit(exitCode); 
} 

consigo Caught NoSuchMethodError java.lang.NoSuchMethodError:

pensé que la captura de excepciones capturar todas las excepciones? ¿Cómo puedo capturar todas las excepciones en Java?

Respuesta

99

Porque algunas excepciones no se derivan de Exception - p. Throwable y Error.

Básicamente la jerarquía de tipos es:

 Object 
     | 
     Throwable 
    /  \ 
Exception  Error 

Sólo Throwables y las clases derivadas pueden ser lanzadas, por lo que si se captura Throwable, que realmente va a coger todo.

Cualquier excepción derivada de Exception (o Exception sí mismo) otra que las derivadas de RuntimeException cuentan como excepciones comprobado - ellos son los que hay que declarar que va a lanzar, atrapar o si se llama a algo eso los arroja.

En total, la jerarquía de excepciones Java es un poco de un desastre ...

+6

+1: buen diagrama! – akf

+1

Los errores no son realmente excepciones, por lo que no se derivan de Excepción. – Powerlord

+2

@R. Bemrose: están de acuerdo con la Especificación del lenguaje Java: "Todas las excepciones están representadas por una instancia de la clase Throwable o una de sus subclases" y "Las clases de excepciones sin verificar son la clase RuntimeException y sus subclases, y la clase Error y sus subclases " –

3

se puede coger Throwable. Error y Excepción extienden Throwable.

ver la Throwable JavaDoc:

La clase Throwable es la superclase de todos los errores y excepciones en el lenguaje Java.

4

La excepción es solo un tipo de Throwable; NoSuchMethodError no es una excepción, sino un error, que es otro tipo de Throwable.

0

Como señalan ambos otros mensajes, catch (Exception e) solo funcionará para las excepciones que se derivan de Exception. Sin embargo, si observa la jerarquía de árbol, notará que existe una excepción Throwable. Throwable también es la clase base para Error también. Entonces, en el caso de NoSuchMethodError, es un Error y no una Excepción. Observe la convención de nomenclatura * Error vs. * Excepción (como en IOException, por ejemplo).

1

Como han señalado otros carteles, no todos los objetos arrojables son subclases de Exception. Sin embargo, en la mayoría de los casos, no es una buena idea capturar Error o Throwable, porque estas condiciones incluyen algunas condiciones de error realmente graves de las que no se puede recuperar fácilmente. Su código de recuperación puede empeorar las cosas.

+0

¿Finalmente todavía se ejecutará alrededor de un error? –

+0

Sí. Pero puede tener más problemas. p.ej. ¿Qué sucede si/cuando atrapas un OutOfMemoryError? –

5

Error s no son Exception s.

La Excepción clase y sus subclases son una forma de Throwable que indica condiciones que un aplicación razonable podría querer atrapar.

- JavaDoc for java.lang.Exception

Un error es una subclase de Throwable que indica serios problemas que una aplicación razonable no debe tratar para ponerse al día.

- JavaDoc for java.lang.Error

Hay ciertos errores que usted puede desear para coger, como ThreadDeath. ThreadDeath se clasifica como un error, como se explica a continuación

El ThreadDeath clase es específicamente una subclase de error en lugar de excepción, a pesar de que es un "normal ocurrencia", ya que muchas aplicaciones captura todas las apariciones de Exception y luego descartar la excepción.

- JavaDoc for ThreadDeath

Sin embargo, puesto que el método de parada de hilo() ahora es obsoleto, que no se debe utilizar, y por lo tanto nunca se debe ver ThreadDeath.

+0

La especificación del lenguaje Java no concuerda contigo: "Las clases de excepciones sin marcar son la clase RuntimeException y sus subclases, y la clase Error y sus subclases". –

+0

Agradezco especialmente los consejos sobre no detectar errores. Considere 'OutOfMemoryErrors': una aplicación puede dejarse en mal estado una vez que se lanza. No sería prudente capturar y descartar este tipo de 'Error'. – akf

+0

Básicamente, el JLS siempre se refiere a "cosas que se pueden arrojar y atrapar" como excepciones. Nada de lo que haya citado allí dice que un Error no es una excepción. –

Cuestiones relacionadas