Setting an exception cause in Java

getCause - Returns the cause of this throwable or null if the cause is nonexistent or unknown. (The cause is the throwable that caused this throwable to get thrown.)

Read the Java documentation: getCause


An Exception has the attributes message and cause. The message is a description, telling a human reader more or less exactly, what went wrong. The cause is something different: it is, if available, another (nested) Throwable.

The concept is often used if we use custom exceptions like this:

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

In response to djangofan's comment:

The standard is that the nested expression (the cause) is printed with its stack trace too.

Running this little application

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

will output

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

Both messages are included.


class Exception has constructors that take a cause Throwable. You need to call those constructors or provide constructors to your custom exception classes that call these super constructors.


The cause is usually set in the constructor of the exception. Look at public Exception(String message, Throwable cause).

If it isn't set in the constructor, you can call initCause().

Tags:

Java

Exception