This is probably a very naive question.
I used to believe that a Throwable
in Java always contains the stack trace. Is it correct?
Now it looks like that I catch exceptions without the stack trace. Does it make sense? Is it possible to catch an exception without the stack trace?
Just use new Throwable(). printStackTrace() method and it will print complete stack trace from where a method is called, into the console.
Simply put, a stack trace is a representation of a call stack at a certain point in time, with each element representing a method invocation. The stack trace contains all invocations from the start of a thread until the point it's generated. This is usually a position at which an exception takes place.
The caller has to handle the exception using a try-catch block or propagate the exception. We can throw either checked or unchecked exceptions. The throws keyword allows the compiler to help you write code that handles this type of error, but it does not prevent the abnormal termination of the program.
If you want to disable it for all exceptions, you can use a byte code instrumentation agent to replace the fillInStackTrace method in the Throwable class. That will however only work for Java 6, since you in Java 5 are not allowed to replace a native method (fillInStackTrace) with a Java method using instrumentation.
It's possible to catch a Throwable object in Java without a stack trace:
Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace)
Constructs a new throwable with the specified detail message, cause, suppression enabled or disabled, and writable stack trace enabled or disabled.
public Throwable fillInStackTrace()
Fills in the execution stack trace. This method records within this Throwable object information about the current state of the stack frames for the current thread.
If the stack trace of this Throwable is not writable, calling this method has no effect.
http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html
For Java 6:
As Java 6 doesn't have the Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace)
constructor, we can suppress the stacktrace filling using below technique (borrowed from Scala, came to know from How slow are Java exceptions?)
class NoStackTraceRuntimeException extends RuntimeException { @Override public synchronized Throwable fillInStackTrace() { return this; } }
Usage is same: throw new NoStackTraceRuntimeException ()
, or it's subtypes.
We can also do the same by extending Throwable
:
class NoStackTraceThrowable extends Throwable { @Override public synchronized Throwable fillInStackTrace() { return this; } }
But, a small catch is that you no longer can catch
these exception using Exception
as this is not subtype of Exception
, instead should catch NoStackTraceThrowable
or it's subtypes.
Update: For some interesting stats on performance in different usecases, check this SO question
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