Définition de la cause d'exception en java


Je peux voir en attrapant une exception que je peux imprimer e.getCause(), bien que ce soit toujours null.

Dois-je le définir quelque part, ou quelque chose manque-t-il qui définit la cause sur null?

Author: LisaMM, 2011-04-27

4 answers

, Une Exception a les attributs message et cause. Le message est une description, dire à un lecteur humain plus ou moins exactement, ce qui a mal tourné. Le cause est quelque chose de différent: il est, si disponible, un autre Throwable (imbriqué).

Le concept est souvent utilisé si nous utilisons des exceptions personnalisées comme ceci:

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

Edit - en réponse au commentaire @djangofans.

La norme est que l'expression imbriquée (la cause) est également imprimée avec sa trace de pile.

Courir ce petit demande

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

Produira

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

Les deux messages sont inclus.

 58
Author: Andreas_D, 2017-01-16 21:46:07

La cause est généralement définie dans le constructeur de l'exception. Regardez exception publique(message de chaîne, cause lancable) .

S'il n'est pas défini dans le constructeur, vous pouvez appeler initCause().

 13
Author: Simon Nickerson, 2011-04-27 07:12:31

Classe Exception a des constructeurs qui prennent un cause Throwable. Vous devez appeler ces constructeurs ou fournir des constructeurs à vos classes d'exceptions personnalisées qui appellent ces super constructeurs.

 2
Author: sjr, 2011-04-27 07:10:25

GetCause - Renvoie la cause de ce throwable ou null si la cause est inexistante ou inconnue. (La cause est le throwable qui a provoqué le throwable.)

Lire le document Java: getCause

 2
Author: CloudyMarble, 2011-04-27 07:12:06