Comment about JDK-8204458 - BigDecimal toString() return different value when use idea run and debug

Jaikiran Pai jai.forums2013 at gmail.com
Wed Jun 20 05:13:50 UTC 2018


(I don't have permissions to comment on the JIRA nor do I see a way to 
submit a comment, as a casual observer, to a bug opened by someone else 
through https://bugs.java.com/. So posting it here. I thought of sending 
it to "discuss" list instead of this one, but this felt more 
appropriate. I hope that's OK.)

As noted in the JIRA https://bugs.openjdk.java.net/browse/JDK-8204458 
the following simple code:

public static void main(final String[] args) throws Exception {
         final BigDecimal bd = new BigDecimal("1");
         System.out.println(bd.toString());
}

returns an "incorrect" output ("0") when run in debug mode with a 
breakpoint in IntelliJ IDE. Apparently not reproducible in other IDEs. I 
use IntelliJ, so gave it a quick try and indeed it does return "0" in a 
specific scenario. What actually triggers this and reproduces this, is 
the combination of 2 things:

- The breakpoint has to be in the constructor of the BigDecimal class 
(which is what the OP has done in that JIRA)
- The fact that the toString() implementation of this class uses a 
"stringCache"

What's really happening (in IntelliJ) is that when the IDE stops at that 
breakpoint, i.e. when the class instance isn't yet fully initialized, 
the IDE tries to render a IDE specific "Variables" view/window, where it 
displays the object instance details. To do so, it internally (in the 
background) appears to be triggering a toString() call on that instance 
being displayed. Effectively, what's happening is that the toString() 
implementation of this BigDecimal class goes and builds up a 
"stringCache" using an uninitialized/partially initialized state of this 
instance (which is still not finished in its constructor) and ends up 
storing an incorrect value of "0" to this "stringCache". As a result, 
the subsequent calls to toString(), even after the object is fully 
initialized return this incorrectly computed/cached value.

This appears to be something the IntelliJ team might have to handle 
better in their debug view/rendering, I guess. I see this as neither 
specific to BigDecimal nor as a bug in this implementation. I believe 
any similar class will run into similar problems for cases like these 
where the instance isn't yet fully initialized to be presented in the 
debug view.

-Jaikiran




More information about the jdk-dev mailing list