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().