2011-04-27 9 views
23

Puedo ver al detectar una excepción que puedo imprimir e.getCause(), aunque siempre es null.Configuración Causa de excepción en java

¿Tengo que configurarlo en algún lugar, o falta algo que está estableciendo la causa a nulo?

Respuesta

49

Una excepción tiene los atributos message y cause. El mensaje es una descripción, diciéndole a un lector humano más o menos exactamente, qué salió mal. El cause es algo diferente: es, si está disponible, otro (anidado) Throwable.

El concepto se utiliza a menudo si usamos excepciones personalizadas como este:

catch(IOException e) { 
    throw new ApplicationException("Failed on reading file soandso", e); 
    //       ^Message      ^Cause 
} 

Editar - en respuesta a @djangofans comentario.

El estándar es que la expresión anidada (la causa) se imprime con su seguimiento de la pila también.

La ejecución de esta pequeña aplicación

public class Exceptions { 
    public static void main(String[] args) { 
     Exception r = new RuntimeException("Some message"); 
     throw new RuntimeException("Some other message", r); 
    } 
} 

es la salida

Exception in thread "main" java.lang.RuntimeException: Some other message 
    at Exceptions.main(Exceptions.java:4) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.RuntimeException: Some message 
    at Exceptions.main(Exceptions.java:3) 
    ... 5 more 

se incluyen ambos mensajes.

+0

¿Es posible mostrar una excepción que también muestre un rastro de pila adicional de una causa adicional? ¿No es eso lo que Vik realmente estaba preguntando? Él no estaba preguntando: mostrar la causa del mensaje, él preguntaba: mostrar causa de excepción. – djangofan

+0

@djangofan - He agregado algunas líneas a mi respuesta. Espero eso ayude. –

2

clase Exception tiene constructores que toman cause Throwable. Debe llamar a esos constructores o proporcionarles constructores a sus clases de excepciones personalizadas que llamen a estos súper constructores.

2

getCause - Devuelve la causa de esta throwable o null si la causa es inexistente o desconocido. (La causa es la throwable que causó esta throwable ser expulsado.)

Leer el documento de Java: getCause

Cuestiones relacionadas