src/java.base/share/classes/java/math/BigDecimal.java
Print this page
rev 11172 : 8064463: BigDecimal should populate NumberFormatException message
Summary: Populate all NumberFormatExceptions with appropriate messages.
Reviewed-by: TBD
@@ -391,11 +391,11 @@
* with rounding according to the context settings.
*
* <p>Note that if the sequence of characters is already available
* within a character array, using this constructor is faster than
* converting the {@code char} array to string and using the
- * {@code BigDecimal(String)} constructor .
+ * {@code BigDecimal(String)} constructor.
*
* @param in {@code char} array that is the source of characters.
* @param offset first character in the array to inspect.
* @param len number of characters to consider..
* @param mc the context to use.
@@ -464,11 +464,12 @@
if (dot)
++scl;
} else if (c == '.') { // have dot
// have dot
if (dot) // two dots
- throw new NumberFormatException();
+ throw new NumberFormatException("Character array"
+ + " contains more than one decimal point.");
dot = true;
} else if (Character.isDigit(c)) { // slow path
int digit = Character.digit(c, 10);
if (digit == 0) {
if (prec == 0)
@@ -486,18 +487,20 @@
++scl;
} else if ((c == 'e') || (c == 'E')) {
exp = parseExp(in, offset, len);
// Next test is required for backwards compatibility
if ((int) exp != exp) // overflow
- throw new NumberFormatException();
+ throw new NumberFormatException("Exponent overflow.");
break; // [saves a test]
} else {
- throw new NumberFormatException();
+ throw new NumberFormatException("Character " + c
+ + " is neither a decimal digit number, decimal point, nor"
+ + " \"e\" notation exponential mark.");
}
}
if (prec == 0) // no digits found
- throw new NumberFormatException();
+ throw new NumberFormatException("No digits found.");
// Adjust scale if exp is not zero.
if (exp != 0) { // had significant exponent
scl = adjustScale(scl, exp);
}
rs = isneg ? -rs : rs;
@@ -539,26 +542,28 @@
}
// have dot
if (c == '.') {
// have dot
if (dot) // two dots
- throw new NumberFormatException();
+ throw new NumberFormatException("Character array"
+ + " contains more than one decimal point.");
dot = true;
continue;
}
// exponent expected
if ((c != 'e') && (c != 'E'))
- throw new NumberFormatException();
+ throw new NumberFormatException("Character array"
+ + " is missing \"e\" notation exponential mark.");
exp = parseExp(in, offset, len);
// Next test is required for backwards compatibility
if ((int) exp != exp) // overflow
- throw new NumberFormatException();
+ throw new NumberFormatException("Exponent overflow");
break; // [saves a test]
}
// here when no characters left
if (prec == 0) // no digits found
- throw new NumberFormatException();
+ throw new NumberFormatException("No digits found.");
// Adjust scale if exp is not zero.
if (exp != 0) { // had significant exponent
scl = adjustScale(scl, exp);
}
// Remove leading zeros from precision (digits count)
@@ -590,14 +595,14 @@
}
rb = null;
}
}
}
- } catch (ArrayIndexOutOfBoundsException e) {
- throw new NumberFormatException();
- } catch (NegativeArraySizeException e) {
- throw new NumberFormatException();
+ } catch (ArrayIndexOutOfBoundsException | NegativeArraySizeException e) {
+ NumberFormatException nfe = new NumberFormatException();
+ nfe.initCause(e);
+ throw nfe;
}
this.scale = scl;
this.precision = prec;
this.intCompact = rs;
this.intVal = rb;
@@ -625,28 +630,28 @@
offset++;
c = in[offset];
len--;
}
if (len <= 0) // no exponent digits
- throw new NumberFormatException();
+ throw new NumberFormatException("No exponent digits.");
// skip leading zeros in the exponent
while (len > 10 && (c=='0' || (Character.digit(c, 10) == 0))) {
offset++;
c = in[offset];
len--;
}
if (len > 10) // too many nonzero exponent digits
- throw new NumberFormatException();
+ throw new NumberFormatException("Too many nonzero exponent digits.");
// c now holds first digit of exponent
for (;; len--) {
int v;
if (c >= '0' && c <= '9') {
v = c - '0';
} else {
v = Character.digit(c, 10);
if (v < 0) // not a digit
- throw new NumberFormatException();
+ throw new NumberFormatException("Not a digit.");
}
exp = exp * 10 + v;
if (len == 1)
break; // that was final character
offset++;