Skip to content

Commit c0679a9

Browse files
committed
fix exception handling
1 parent d1bc59d commit c0679a9

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

src/main/java/com/fasterxml/jackson/core/io/BigDecimalParser.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,18 @@ private BigDecimalParser() {}
4040
* @throws NumberFormatException
4141
*/
4242
public static BigDecimal parse(String valueStr) {
43-
if (valueStr.length() < 500) {
44-
return new BigDecimal(valueStr);
43+
try {
44+
if (valueStr.length() < 500) {
45+
return new BigDecimal(valueStr);
46+
}
47+
// workaround https://github.com/FasterXML/jackson-databind/issues/4694
48+
return JavaBigDecimalParser.parseBigDecimal(valueStr);
49+
50+
// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
51+
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:
52+
} catch (ArithmeticException | NumberFormatException e) {
53+
throw _parseFailure(e, valueStr);
4554
}
46-
// workaround https://github.com/FasterXML/jackson-databind/issues/4694
47-
return JavaBigDecimalParser.parseBigDecimal(valueStr);
4855
}
4956

5057
/**
@@ -68,7 +75,7 @@ public static BigDecimal parse(final char[] chars, final int off, final int len)
6875
// 20-Aug-2022, tatu: Although "new BigDecimal(...)" only throws NumberFormatException
6976
// operations by "parseBigDecimal()" can throw "ArithmeticException", so handle both:
7077
} catch (ArithmeticException | NumberFormatException e) {
71-
throw _parseFailure(e, new String(chars, off, len));
78+
throw _parseFailure(e, chars, off, len);
7279
}
7380
}
7481

@@ -118,7 +125,8 @@ public static BigDecimal parseWithFastParser(final String valueStr) {
118125
*/
119126
public static BigDecimal parseWithFastParser(final char[] ch, final int off, final int len) {
120127
try {
121-
return JavaBigDecimalParser.parseBigDecimal(ch, off, len);
128+
// workaround https://github.com/FasterXML/jackson-databind/issues/4694
129+
return JavaBigDecimalParser.parseBigDecimal(new String(ch, off, len));
122130
} catch (ArithmeticException | NumberFormatException e) {
123131
throw _parseFailure(e, new String(ch, off, len));
124132
}
@@ -131,11 +139,23 @@ private static NumberFormatException _parseFailure(Exception e, String fullValue
131139
desc = "Not a valid number representation";
132140
}
133141
String valueToReport = _getValueDesc(fullValue);
134-
return new NumberFormatException("Value " + valueToReport
135-
+ " can not be deserialized as `java.math.BigDecimal`, reason: " + desc);
142+
return new NumberFormatException(_generateExceptionMessage(valueToReport, desc));
143+
}
144+
145+
private static NumberFormatException _parseFailure(final Exception e,
146+
final char[] array,
147+
final int offset,
148+
final int len) {
149+
String desc = e.getMessage();
150+
// 05-Feb-2021, tatu: Alas, JDK mostly has null message so:
151+
if (desc == null) {
152+
desc = "Not a valid number representation";
153+
}
154+
String valueToReport = _getValueDesc(array, offset, len);
155+
return new NumberFormatException(_generateExceptionMessage(valueToReport, desc));
136156
}
137157

138-
private static String _getValueDesc(String fullValue) {
158+
private static String _getValueDesc(final String fullValue) {
139159
final int len = fullValue.length();
140160
if (len <= MAX_CHARS_TO_REPORT) {
141161
return String.format("\"%s\"", fullValue);
@@ -145,4 +165,18 @@ private static String _getValueDesc(String fullValue) {
145165
MAX_CHARS_TO_REPORT, len);
146166
}
147167

168+
private static String _getValueDesc(final char[] array, final int offset, final int len) {
169+
if (len <= MAX_CHARS_TO_REPORT) {
170+
return String.format("\"%s\"", new String(array, offset, len));
171+
}
172+
return String.format("\"%s\" (truncated to %d chars (from %d))",
173+
new String(array, offset, MAX_CHARS_TO_REPORT),
174+
MAX_CHARS_TO_REPORT, len);
175+
}
176+
177+
private static String _generateExceptionMessage(final String valueToReport, final String desc) {
178+
return String.format("Value %s cannot be deserialized as `java.math.BigDecimal`, reason: %s" ,
179+
valueToReport, desc);
180+
}
181+
148182
}

src/test/java/com/fasterxml/jackson/core/io/BigDecimalParserTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ void issueDatabind4694() {
5858
final BigDecimal expected = new BigDecimal(str);
5959
assertEquals(expected, JavaBigDecimalParser.parseBigDecimal(str));
6060
assertEquals(expected, BigDecimalParser.parse(str));
61+
assertEquals(expected, BigDecimalParser.parseWithFastParser(str));
6162
final char[] arr = str.toCharArray();
6263
assertEquals(expected, BigDecimalParser.parse(arr, 0, arr.length));
64+
assertEquals(expected, BigDecimalParser.parseWithFastParser(arr, 0, arr.length));
6365
}
6466

6567
static String genLongInvalidString() {

0 commit comments

Comments
 (0)