<i18n dev> RFR: JDK-8326908: DecimalFormat::toPattern throws OutOfMemoryError when pattern is empty string
Justin Lu
jlu at openjdk.org
Tue Mar 5 00:32:48 UTC 2024
On Sun, 3 Mar 2024 05:00:36 GMT, Guoxiong Li <gli at openjdk.org> wrote:
>> Please review this PR and corresponding CSR which prevents an OutOfMemoryError by restricting the initial maximum fraction digits for an empty pattern DecimalFormat.
>>
>> For an empty String pattern DecimalFormat, the maximum fraction digits is initialized to `Integer.MAX_VALUE`. When toPattern() is invoked, StringBuilder internally doubles capacity attempting to append Integer.MAX_VALUE digits until OOME occurs. CSR covers potential behavioral compatibility changes.
>
>> When toPattern() is invoked, StringBuilder internally doubles capacity attempting to append Integer.MAX_VALUE digits until OOME occurs.
>
> It seems a bug in `toPattern` or `StringBuilder`? May be better to investigate more about it.
Hi @lgxbslgx,
For clarification, this is entirely a bug with DecimalFormat, not StringBuilder. An empty String pattern DecimalFormat sets the maximum fraction digits to `Integer.MAX_VALUE`. When toPattern() is invoked, the local StringBuilder will append until an OOME is thrown by the StringBuilder as there is not enough memory, when internally, the buffer is doubled for a value too large. But such an OOME would occur for any large enough value, so the issue lies with DecimalFormat.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/18094#issuecomment-1977712428
More information about the i18n-dev
mailing list