A DESCRIPTION OF THE PROBLEM :
When printing the stack trace of an exception which has circular references, the text "[CIRCULAR REFERENCE:...]" is always indented with a single tab, ignoring the current indentation level. This can be confusing for suppressed exceptions as demonstrated in the provided code.
Note also that there is a space missing after the colon:
"[CIRCULAR REFERENCE:java.lang.Exception: first]"
And ideally this message should include the caption (e.g. "Suppressed: [CIRCULAR ...") as well. Currently it is ambiguous whether this line represents a suppressed exception of the enclosing exception, or the cause of a preceding suppressed exception.
---------- BEGIN SOURCE ----------
public class DejaVuStackTrace {
public static void main(String[] args) {
Exception first = new Exception("first");
Exception second = new Exception("second");
first.addSuppressed(second);
Exception third = new Exception("third");
second.addSuppressed(third);
Exception fourth = new Exception("fourth");
third.addSuppressed(fourth);
// Create circular reference
fourth.addSuppressed(first);
fourth.addSuppressed(new Exception("fifth"));
first.printStackTrace();
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Suggested fix:
https://github.com/openjdk/jdk/blob/c5cc07bec63fd7cad3e052cef53a5b19a4978e40/src/java.base/share/classes/java/lang/Throwable.java#L696
Change the line to this:
s.println(prefix + caption + "[CIRCULAR REFERENCE: " + this + "]");
FREQUENCY : always