I can see on catching an exception that I can print e.getCause()
, though it is always null
.
Do I need to set it somewhere, or is something missing which is setting the cause to null?
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().
The getCause() method is from Throwable class and we can use this method which returns the cause of the exception or returns null if the cause of the exception is not known.
Throwable(Throwable cause) :- Where cause is the exception that causes the current exception. Throwable(String msg, Throwable cause) :- Where msg is the exception message and cause is the exception that causes the current exception.
Exceptions are the unwanted errors or bugs or events that restrict the normal execution of a program. Each time an exception occurs, program execution gets disrupted. An error message is displayed on the screen. There are several reasons behind the occurrence of exceptions.
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.
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().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With