Impostazione della causa dell’eccezione in java

Riesco a vedere sulla cattura di un’eccezione che posso stampare e.getCause() , sebbene sia sempre null .

Devo impostarlo da qualche parte o manca qualcosa che sta impostando la causa su null?

Un’eccezione ha il message e la cause degli attributi. Il messaggio è una descrizione che dice a un lettore umano più o meno esattamente cosa è andato storto. La cause è qualcosa di diverso: è, se disponibile, un altro (annidato) Throwable .

Il concetto è spesso usato se usiamo eccezioni personalizzate come questa:

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

Modifica – in risposta al commento di @djangofans.

Lo standard è che l’espressione nidificata (la causa) viene stampata anche con la sua traccia stack.

Esecuzione di questa piccola applicazione

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

uscirà

 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 

Entrambi i messaggi sono inclusi.

La causa viene solitamente impostata nel costruttore dell’eccezione. Guarda l’eccezione pubblica (messaggio String, causa Throwable) .

Se non è impostato nel costruttore, puoi chiamare initCause () .

class Exception ha costruttori che prendono una cause Throwable. È necessario chiamare quei costruttori o fornire i costruttori alle proprie classi di eccezioni personalizzate che chiamano questi super costruttori.

getCause : restituisce la causa di questo throwable o null se la causa è inesistente o sconosciuta. (La causa è il gettabile che ha causato il lancio di questo proiettile.)

Leggi il documento Java: getCause