Added throw declarations for package util.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1381283 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Luc Maisonobe 2012-09-05 18:29:47 +00:00
parent 003f022df4
commit 1dd611f794
8 changed files with 158 additions and 86 deletions

View File

@ -61,7 +61,8 @@ public final class ArithmeticUtils {
* as an {@code int}.
* @since 1.1
*/
public static int addAndCheck(int x, int y) {
public static int addAndCheck(int x, int y)
throws MathArithmeticException {
long s = (long)x + (long)y;
if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW_IN_ADDITION, x, y);
@ -79,7 +80,7 @@ public final class ArithmeticUtils {
* long
* @since 1.2
*/
public static long addAndCheck(long a, long b) {
public static long addAndCheck(long a, long b) throws MathArithmeticException {
return ArithmeticUtils.addAndCheck(a, b, LocalizedFormats.OVERFLOW_IN_ADDITION);
}
@ -109,7 +110,8 @@ public final class ArithmeticUtils {
* @throws MathArithmeticException if the result is too large to be
* represented by a long integer.
*/
public static long binomialCoefficient(final int n, final int k) {
public static long binomialCoefficient(final int n, final int k)
throws NotPositiveException, NumberIsTooLargeException, MathArithmeticException {
ArithmeticUtils.checkBinomial(n, k);
if ((n == k) || (k == 0)) {
return 1;
@ -186,8 +188,11 @@ public final class ArithmeticUtils {
* @return {@code n choose k}
* @throws NotPositiveException if {@code n < 0}.
* @throws NumberIsTooLargeException if {@code k > n}.
* @throws MathArithmeticException if the result is too large to be
* represented by a long integer.
*/
public static double binomialCoefficientDouble(final int n, final int k) {
public static double binomialCoefficientDouble(final int n, final int k)
throws NotPositiveException, NumberIsTooLargeException, MathArithmeticException {
ArithmeticUtils.checkBinomial(n, k);
if ((n == k) || (k == 0)) {
return 1d;
@ -228,8 +233,11 @@ public final class ArithmeticUtils {
* @return {@code n choose k}
* @throws NotPositiveException if {@code n < 0}.
* @throws NumberIsTooLargeException if {@code k > n}.
* @throws MathArithmeticException if the result is too large to be
* represented by a long integer.
*/
public static double binomialCoefficientLog(final int n, final int k) {
public static double binomialCoefficientLog(final int n, final int k)
throws NotPositiveException, NumberIsTooLargeException, MathArithmeticException {
ArithmeticUtils.checkBinomial(n, k);
if ((n == k) || (k == 0)) {
return 0;
@ -300,7 +308,7 @@ public final class ArithmeticUtils {
* @throws MathArithmeticException if {@code n > 20}: The factorial value is too
* large to fit in a {@code long}.
*/
public static long factorial(final int n) {
public static long factorial(final int n) throws NotPositiveException, MathArithmeticException {
if (n < 0) {
throw new NotPositiveException(LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
n);
@ -324,13 +332,13 @@ public final class ArithmeticUtils {
* @return {@code n!}
* @throws NotPositiveException if {@code n < 0}.
*/
public static double factorialDouble(final int n) {
public static double factorialDouble(final int n) throws NotPositiveException, MathArithmeticException {
if (n < 0) {
throw new NotPositiveException(LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
n);
}
if (n < 21) {
return factorial(n);
return FACTORIALS[n];
}
return FastMath.floor(FastMath.exp(ArithmeticUtils.factorialLog(n)) + 0.5);
}
@ -342,13 +350,13 @@ public final class ArithmeticUtils {
* @return {@code n!}
* @throws NotPositiveException if {@code n < 0}.
*/
public static double factorialLog(final int n) {
public static double factorialLog(final int n) throws NotPositiveException {
if (n < 0) {
throw new NotPositiveException(LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
n);
}
if (n < 21) {
return FastMath.log(factorial(n));
return FastMath.log(FACTORIALS[n]);
}
double logSum = 0;
for (int i = 2; i <= n; i++) {
@ -529,7 +537,7 @@ public final class ArithmeticUtils {
* a non-negative {@code long} value.
* @since 2.1
*/
public static long gcd(final long p, final long q) {
public static long gcd(final long p, final long q) throws MathArithmeticException {
long u = p;
long v = q;
if ((u == 0) || (v == 0)) {
@ -609,7 +617,7 @@ public final class ArithmeticUtils {
* a non-negative {@code int} value.
* @since 1.1
*/
public static int lcm(int a, int b) {
public static int lcm(int a, int b) throws MathArithmeticException {
if (a == 0 || b == 0){
return 0;
}
@ -643,7 +651,7 @@ public final class ArithmeticUtils {
* as a non-negative {@code long} value.
* @since 2.1
*/
public static long lcm(long a, long b) {
public static long lcm(long a, long b) throws MathArithmeticException {
if (a == 0 || b == 0){
return 0;
}
@ -665,7 +673,7 @@ public final class ArithmeticUtils {
* represented as an {@code int}.
* @since 1.1
*/
public static int mulAndCheck(int x, int y) {
public static int mulAndCheck(int x, int y) throws MathArithmeticException {
long m = ((long)x) * ((long)y);
if (m < Integer.MIN_VALUE || m > Integer.MAX_VALUE) {
throw new MathArithmeticException();
@ -683,7 +691,7 @@ public final class ArithmeticUtils {
* as a {@code long}.
* @since 1.2
*/
public static long mulAndCheck(long a, long b) {
public static long mulAndCheck(long a, long b) throws MathArithmeticException {
long ret;
if (a > b) {
// use symmetry to reduce boundary cases
@ -737,7 +745,7 @@ public final class ArithmeticUtils {
* as an {@code int}.
* @since 1.1
*/
public static int subAndCheck(int x, int y) {
public static int subAndCheck(int x, int y) throws MathArithmeticException {
long s = (long)x - (long)y;
if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW_IN_SUBTRACTION, x, y);
@ -755,7 +763,7 @@ public final class ArithmeticUtils {
* {@code long}.
* @since 1.2
*/
public static long subAndCheck(long a, long b) {
public static long subAndCheck(long a, long b) throws MathArithmeticException {
long ret;
if (b == Long.MIN_VALUE) {
if (a < 0) {
@ -778,7 +786,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static int pow(final int k, int e) {
public static int pow(final int k, int e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -804,7 +812,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static int pow(final int k, long e) {
public static int pow(final int k, long e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -830,7 +838,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static long pow(final long k, int e) {
public static long pow(final long k, int e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -856,7 +864,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static long pow(final long k, long e) {
public static long pow(final long k, long e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -882,7 +890,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static BigInteger pow(final BigInteger k, int e) {
public static BigInteger pow(final BigInteger k, int e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -898,7 +906,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static BigInteger pow(final BigInteger k, long e) {
public static BigInteger pow(final BigInteger k, long e) throws NotPositiveException {
if (e < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -925,7 +933,7 @@ public final class ArithmeticUtils {
* @return k<sup>e</sup>
* @throws NotPositiveException if {@code e < 0}.
*/
public static BigInteger pow(final BigInteger k, BigInteger e) {
public static BigInteger pow(final BigInteger k, BigInteger e) throws NotPositiveException {
if (e.compareTo(BigInteger.ZERO) < 0) {
throw new NotPositiveException(LocalizedFormats.EXPONENT, e);
}
@ -1039,7 +1047,7 @@ public final class ArithmeticUtils {
* as a {@code long}.
* @since 1.2
*/
private static long addAndCheck(long a, long b, Localizable pattern) {
private static long addAndCheck(long a, long b, Localizable pattern) throws MathArithmeticException {
long ret;
if (a > b) {
// use symmetry to reduce boundary cases
@ -1082,7 +1090,7 @@ public final class ArithmeticUtils {
* @throws NotPositiveException if {@code n < 0}.
* @throws NumberIsTooLargeException if {@code k > n}.
*/
private static void checkBinomial(final int n, final int k) {
private static void checkBinomial(final int n, final int k) throws NumberIsTooLargeException, NotPositiveException {
if (n < k) {
throw new NumberIsTooLargeException(LocalizedFormats.BINOMIAL_INVALID_PARAMETERS_ORDER,
k, n, true);

View File

@ -248,7 +248,7 @@ public class BigReal implements FieldElement<BigReal>, Comparable<BigReal>, Seri
*
* @throws MathArithmeticException if {@code a} is zero
*/
public BigReal divide(BigReal a) {
public BigReal divide(BigReal a) throws MathArithmeticException {
try {
return new BigReal(d.divide(a.d, scale, roundingMode));
} catch (ArithmeticException e) {
@ -262,7 +262,7 @@ public class BigReal implements FieldElement<BigReal>, Comparable<BigReal>, Seri
*
* @throws MathArithmeticException if {@code this} is zero
*/
public BigReal reciprocal() {
public BigReal reciprocal() throws MathArithmeticException {
try {
return new BigReal(BigDecimal.ONE.divide(d, scale, roundingMode));
} catch (ArithmeticException e) {

View File

@ -17,6 +17,7 @@
package org.apache.commons.math3.util;
import org.apache.commons.math3.exception.ConvergenceException;
import org.apache.commons.math3.exception.MathInternalError;
import org.apache.commons.math3.exception.MaxCountExceededException;
import org.apache.commons.math3.exception.util.LocalizedFormats;
@ -69,8 +70,13 @@ public abstract class ContinuedFraction {
* @return the value of the continued fraction evaluated at x.
* @throws ConvergenceException if the algorithm fails to converge.
*/
public double evaluate(double x) {
return evaluate(x, DEFAULT_EPSILON, Integer.MAX_VALUE);
public double evaluate(double x) throws ConvergenceException {
try {
return evaluate(x, DEFAULT_EPSILON, Integer.MAX_VALUE);
} catch (MaxCountExceededException e) {
// this should never happen as integers never exceed MAX_VALUE
throw new MathInternalError(e);
}
}
/**
@ -80,8 +86,13 @@ public abstract class ContinuedFraction {
* @return the value of the continued fraction evaluated at x.
* @throws ConvergenceException if the algorithm fails to converge.
*/
public double evaluate(double x, double epsilon) {
return evaluate(x, epsilon, Integer.MAX_VALUE);
public double evaluate(double x, double epsilon) throws ConvergenceException {
try {
return evaluate(x, epsilon, Integer.MAX_VALUE);
} catch (MaxCountExceededException e) {
// this should never happen as integers never exceed MAX_VALUE
throw new MathInternalError(e);
}
}
/**
@ -90,8 +101,10 @@ public abstract class ContinuedFraction {
* @param maxIterations maximum number of convergents
* @return the value of the continued fraction evaluated at x.
* @throws ConvergenceException if the algorithm fails to converge.
* @throws MaxCountExceededException if maximal number of iterations is reached
*/
public double evaluate(double x, int maxIterations) {
public double evaluate(double x, int maxIterations)
throws ConvergenceException, MaxCountExceededException {
return evaluate(x, DEFAULT_EPSILON, maxIterations);
}
@ -119,8 +132,10 @@ public abstract class ContinuedFraction {
* @param maxIterations maximum number of convergents
* @return the value of the continued fraction evaluated at x.
* @throws ConvergenceException if the algorithm fails to converge.
* @throws MaxCountExceededException if maximal number of iterations is reached
*/
public double evaluate(double x, double epsilon, int maxIterations) {
public double evaluate(double x, double epsilon, int maxIterations)
throws ConvergenceException, MaxCountExceededException {
final double small = 1e-50;
double hPrev = getA(0, x);

View File

@ -209,7 +209,12 @@ public class MathArrays {
public static boolean isMonotonic(double[] val,
OrderDirection dir,
boolean strict) {
return checkOrder(val, dir, strict, false);
try {
return checkOrder(val, dir, strict, false);
} catch (NonMonotonicSequenceException e) {
// this should never happen as abort is set to false
throw new MathInternalError(e);
}
}
/**
@ -224,7 +229,8 @@ public class MathArrays {
* and {@code abort} is {@code true}.
*/
public static boolean checkOrder(double[] val, OrderDirection dir,
boolean strict, boolean abort) {
boolean strict, boolean abort)
throws NonMonotonicSequenceException {
double previous = val[0];
final int max = val.length;
@ -285,7 +291,7 @@ public class MathArrays {
* @since 2.2
*/
public static void checkOrder(double[] val, OrderDirection dir,
boolean strict) {
boolean strict) throws NonMonotonicSequenceException {
checkOrder(val, dir, strict, true);
}
@ -296,7 +302,7 @@ public class MathArrays {
* @throws NonMonotonicSequenceException if the array is not sorted.
* @since 2.2
*/
public static void checkOrder(double[] val) {
public static void checkOrder(double[] val) throws NonMonotonicSequenceException {
checkOrder(val, OrderDirection.INCREASING, true);
}
@ -431,8 +437,8 @@ public class MathArrays {
* @throws NullArgumentException if {@code x} or any {@code y} is null.
* @since 3.0
*/
public static void sortInPlace(double[] x,
double[] ... yList) {
public static void sortInPlace(double[] x, double[] ... yList)
throws DimensionMismatchException, NullArgumentException {
sortInPlace(x, OrderDirection.INCREASING, yList);
}
@ -455,7 +461,8 @@ public class MathArrays {
*/
public static void sortInPlace(double[] x,
final OrderDirection dir,
double[] ... yList) {
double[] ... yList)
throws NullArgumentException, DimensionMismatchException {
if (x == null) {
throw new NullArgumentException();
}
@ -577,8 +584,10 @@ public class MathArrays {
* @param a Factors.
* @param b Factors.
* @return <code>&Sigma;<sub>i</sub> a<sub>i</sub> b<sub>i</sub></code>.
* @throws DimensionMismatchException if arrays dimensions don't match
*/
public static double linearCombination(final double[] a, final double[] b) {
public static double linearCombination(final double[] a, final double[] b)
throws DimensionMismatchException {
final int len = a.length;
if (len != b.length) {
throw new DimensionMismatchException(len, b.length);
@ -1052,7 +1061,8 @@ public class MathArrays {
* @throws MathIllegalArgumentException if the target sum is infinite or {@code NaN}.
* @since 2.1
*/
public static double[] normalizeArray(double[] values, double normalizedSum) {
public static double[] normalizeArray(double[] values, double normalizedSum)
throws MathIllegalArgumentException, MathArithmeticException {
if (Double.isInfinite(normalizedSum)) {
throw new MathIllegalArgumentException(LocalizedFormats.NORMALIZE_INFINITE);
}

View File

@ -124,7 +124,8 @@ public final class MathUtils {
* @throws MathArithmeticException if {@code magnitude == Byte.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static byte copySign(byte magnitude, byte sign) {
public static byte copySign(byte magnitude, byte sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
@ -146,7 +147,8 @@ public final class MathUtils {
* @throws MathArithmeticException if {@code magnitude == Short.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static short copySign(short magnitude, short sign) {
public static short copySign(short magnitude, short sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
@ -168,7 +170,8 @@ public final class MathUtils {
* @throws MathArithmeticException if {@code magnitude == Integer.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static int copySign(int magnitude, int sign) {
public static int copySign(int magnitude, int sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
@ -190,7 +193,8 @@ public final class MathUtils {
* @throws MathArithmeticException if {@code magnitude == Long.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static long copySign(long magnitude, long sign) {
public static long copySign(long magnitude, long sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
@ -208,7 +212,8 @@ public final class MathUtils {
* @throws NotFiniteNumberException if {@code x} is not a
* finite real number.
*/
public static void checkFinite(final double x) {
public static void checkFinite(final double x)
throws NotFiniteNumberException {
if (Double.isInfinite(x) || Double.isNaN(x)) {
throw new NotFiniteNumberException(x);
}
@ -221,7 +226,8 @@ public final class MathUtils {
* @throws NotFiniteNumberException if any values of the array is not a
* finite real number.
*/
public static void checkFinite(final double[] val) {
public static void checkFinite(final double[] val)
throws NotFiniteNumberException {
for (int i = 0; i < val.length; i++) {
final double x = val[i];
if (Double.isInfinite(x) || Double.isNaN(x)) {
@ -240,7 +246,8 @@ public final class MathUtils {
*/
public static void checkNotNull(Object o,
Localizable pattern,
Object ... args) {
Object ... args)
throws NullArgumentException {
if (o == null) {
throw new NullArgumentException(pattern, args);
}

View File

@ -18,6 +18,7 @@
package org.apache.commons.math3.util;
import org.apache.commons.math3.exception.DimensionMismatchException;
import org.apache.commons.math3.exception.MathInternalError;
import org.apache.commons.math3.exception.OutOfRangeException;
import org.apache.commons.math3.exception.NotStrictlyPositiveException;
@ -162,7 +163,7 @@ public class MultidimensionalCounter implements Iterable<Integer> {
* @throws NotStrictlyPositiveException if one of the sizes is
* negative or zero.
*/
public MultidimensionalCounter(int ... size) {
public MultidimensionalCounter(int ... size) throws NotStrictlyPositiveException {
dimension = size.length;
this.size = MathArrays.copyOf(size);
@ -213,7 +214,7 @@ public class MultidimensionalCounter implements Iterable<Integer> {
* @throws OutOfRangeException if {@code index} is not between
* {@code 0} and the value returned by {@link #getSize()} (excluded).
*/
public int[] getCounts(int index) {
public int[] getCounts(int index) throws OutOfRangeException {
if (index < 0 ||
index >= totalSize) {
throw new OutOfRangeException(index, 0, totalSize);
@ -250,7 +251,8 @@ public class MultidimensionalCounter implements Iterable<Integer> {
* the range of the corresponding dimension, as defined in the
* {@link MultidimensionalCounter#MultidimensionalCounter(int...) constructor}.
*/
public int getCount(int ... c) throws OutOfRangeException {
public int getCount(int ... c)
throws OutOfRangeException, DimensionMismatchException {
if (c.length != dimension) {
throw new DimensionMismatchException(c.length, dimension);
}
@ -290,7 +292,15 @@ public class MultidimensionalCounter implements Iterable<Integer> {
public String toString() {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < dimension; i++) {
sb.append("[").append(getCount(i)).append("]");
try {
sb.append("[").append(getCount(i)).append("]");
} catch (OutOfRangeException e) {
// this should never happen
throw new MathInternalError(e);
} catch (DimensionMismatchException e) {
// this should never happen
throw new MathInternalError(e);
}
}
return sb.toString();
}

View File

@ -20,6 +20,7 @@ package org.apache.commons.math3.util;
import java.math.BigDecimal;
import org.apache.commons.math3.exception.MathArithmeticException;
import org.apache.commons.math3.exception.MathIllegalArgumentException;
import org.apache.commons.math3.exception.MathInternalError;
import org.apache.commons.math3.exception.util.LocalizedFormats;
/**
@ -391,7 +392,15 @@ public class Precision {
* @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
*/
public static float round(float x, int scale) {
try {
return round(x, scale, BigDecimal.ROUND_HALF_UP);
} catch (MathArithmeticException e) {
// should never happen as we don't use BigDecimal.ROUND_UNNECESSARY
throw new MathInternalError(e);
} catch (MathIllegalArgumentException e) {
// should never happen as we use a valid rounding
throw new MathInternalError(e);
}
}
/**
@ -404,8 +413,11 @@ public class Precision {
* @param roundingMethod Rounding method as defined in {@link BigDecimal}.
* @return the rounded value.
* @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
* @throws MathArithmeticException if an exact operation is required but result is not exact
* @throws MathIllegalArgumentException if {@code roundingMethod} is not a valid rounding method.
*/
public static float round(float x, int scale, int roundingMethod) {
public static float round(float x, int scale, int roundingMethod)
throws MathArithmeticException, MathIllegalArgumentException {
final float sign = FastMath.copySign(1f, x);
final float factor = (float) FastMath.pow(10.0f, scale) * sign;
return (float) roundUnscaled(x * factor, sign, roundingMethod) / factor;
@ -420,12 +432,14 @@ public class Precision {
* @param sign Sign of the original, scaled value.
* @param roundingMethod Rounding method, as defined in {@link BigDecimal}.
* @return the rounded value.
* @throws MathArithmeticException if an exact operation is required but result is not exact
* @throws MathIllegalArgumentException if {@code roundingMethod} is not a valid rounding method.
* @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
*/
private static double roundUnscaled(double unscaled,
double sign,
int roundingMethod) {
int roundingMethod)
throws MathArithmeticException, MathIllegalArgumentException {
switch (roundingMethod) {
case BigDecimal.ROUND_CEILING :
if (sign == -1) {

View File

@ -21,6 +21,7 @@ import java.util.Arrays;
import org.apache.commons.math3.exception.MathIllegalArgumentException;
import org.apache.commons.math3.exception.MathIllegalStateException;
import org.apache.commons.math3.exception.MathInternalError;
import org.apache.commons.math3.exception.NullArgumentException;
import org.apache.commons.math3.exception.util.LocalizedFormats;
@ -155,9 +156,9 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* <li><code>contractionFactor = 2.0</code></li>
* </ul>
* @param initialCapacity The initial size of the internal storage array
* @throws IllegalArgumentException if initialCapacity is not > 0
* @throws MathIllegalArgumentException if initialCapacity is not > 0
*/
public ResizableDoubleArray(int initialCapacity) {
public ResizableDoubleArray(int initialCapacity) throws MathIllegalArgumentException {
setInitialCapacity(initialCapacity);
internalArray = new double[this.initialCapacity];
}
@ -210,9 +211,9 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* @param initialCapacity The initial size of the internal storage array
* @param expansionFactor the array will be expanded based on this
* parameter
* @throws IllegalArgumentException if parameters are not valid
* @throws MathIllegalArgumentException if parameters are not valid
*/
public ResizableDoubleArray(int initialCapacity, float expansionFactor) {
public ResizableDoubleArray(int initialCapacity, float expansionFactor) throws MathIllegalArgumentException {
this.expansionFactor = expansionFactor;
setInitialCapacity(initialCapacity);
internalArray = new double[initialCapacity];
@ -236,10 +237,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* @param expansionFactor the array will be expanded based on this
* parameter
* @param contractionCriteria The contraction Criteria.
* @throws IllegalArgumentException if parameters are not valid
* @throws MathIllegalArgumentException if parameters are not valid
*/
public ResizableDoubleArray(int initialCapacity, float expansionFactor,
float contractionCriteria) {
float contractionCriteria) throws MathIllegalArgumentException {
this.expansionFactor = expansionFactor;
setContractionCriteria(contractionCriteria);
setInitialCapacity(initialCapacity);
@ -265,10 +266,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* parameter
* @param contractionCriteria the contraction Criteria
* @param expansionMode the expansion mode
* @throws IllegalArgumentException if parameters are not valid
* @throws MathIllegalArgumentException if parameters are not valid
*/
public ResizableDoubleArray(int initialCapacity, float expansionFactor,
float contractionCriteria, int expansionMode) {
float contractionCriteria, int expansionMode) throws MathIllegalArgumentException {
this.expansionFactor = expansionFactor;
setContractionCriteria(contractionCriteria);
setInitialCapacity(initialCapacity);
@ -365,10 +366,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
*
* @param value new value to substitute for the most recently added value
* @return value that has been replaced in the array
* @throws IllegalStateException if the array is empty
* @throws MathIllegalStateException if the array is empty
* @since 2.0
*/
public synchronized double substituteMostRecentElement(double value) {
public synchronized double substituteMostRecentElement(double value) throws MathIllegalStateException {
if (numElements < 1) {
throw new MathIllegalStateException(
LocalizedFormats.CANNOT_SUBSTITUTE_ELEMENT_FROM_EMPTY_ARRAY);
@ -389,10 +390,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
*
* @param expansion factor to be checked
* @param contraction criteria to be checked
* @throws IllegalArgumentException if the contractionCriteria is less than
* @throws MathIllegalArgumentException if the contractionCriteria is less than
* the expansionCriteria.
*/
protected void checkContractExpand(float contraction, float expansion) {
protected void checkContractExpand(float contraction, float expansion) throws MathIllegalArgumentException {
if (contraction < expansion) {
throw new MathIllegalArgumentException(
@ -447,10 +448,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* if i exceeds numElements.
*
* @param i the number of elements to discard from the front of the array
* @throws IllegalArgumentException if i is greater than numElements.
* @throws MathIllegalArgumentException if i is greater than numElements.
* @since 2.0
*/
public synchronized void discardFrontElements(int i) {
public synchronized void discardFrontElements(int i) throws MathIllegalArgumentException {
discardExtremeElements(i,true);
@ -464,10 +465,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* if i exceeds numElements.
*
* @param i the number of elements to discard from the end of the array
* @throws IllegalArgumentException if i is greater than numElements.
* @throws MathIllegalArgumentException if i is greater than numElements.
* @since 2.0
*/
public synchronized void discardMostRecentElements(int i) {
public synchronized void discardMostRecentElements(int i) throws MathIllegalArgumentException {
discardExtremeElements(i,false);
@ -489,10 +490,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* @param front true if elements are to be discarded from the front
* of the array, false if elements are to be discarded from the end
* of the array
* @throws IllegalArgumentException if i is greater than numElements.
* @throws MathIllegalArgumentException if i is greater than numElements.
* @since 2.0
*/
private synchronized void discardExtremeElements(int i,boolean front) {
private synchronized void discardExtremeElements(int i,boolean front) throws MathIllegalArgumentException {
if (i > numElements) {
throw new MathIllegalArgumentException(
LocalizedFormats.TOO_MANY_ELEMENTS_TO_DISCARD_FROM_ARRAY,
@ -671,8 +672,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* Sets the contraction criteria for this ExpandContractDoubleArray.
*
* @param contractionCriteria contraction criteria
* @throws MathIllegalArgumentException if the contractionCriteria is less than
* the expansionCriteria.
*/
public void setContractionCriteria(float contractionCriteria) {
public void setContractionCriteria(float contractionCriteria) throws MathIllegalArgumentException {
checkContractExpand(contractionCriteria, getExpansionFactor());
synchronized(this) {
this.contractionCriteria = contractionCriteria;
@ -713,10 +716,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* <li><code>contractionFactor >= expansionFactor</code></li>
* </ul>
* @param expansionFactor the new expansion factor value.
* @throws IllegalArgumentException if expansionFactor is <= 1 or greater
* @throws MathIllegalArgumentException if expansionFactor is <= 1 or greater
* than contractionFactor
*/
public void setExpansionFactor(float expansionFactor) {
public void setExpansionFactor(float expansionFactor) throws MathIllegalArgumentException {
checkContractExpand(getContractionCriteria(), expansionFactor);
// The check above verifies that the expansion factor is > 1.0;
synchronized(this) {
@ -729,9 +732,9 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* ADDITIVE_MODE, MULTIPLICATIVE_MODE.
*
* @param expansionMode The expansionMode to set.
* @throws IllegalArgumentException if the specified mode value is not valid
* @throws MathIllegalArgumentException if the specified mode value is not valid
*/
public void setExpansionMode(int expansionMode) {
public void setExpansionMode(int expansionMode) throws MathIllegalArgumentException {
if (expansionMode != MULTIPLICATIVE_MODE &&
expansionMode != ADDITIVE_MODE) {
throw new MathIllegalArgumentException(
@ -748,10 +751,10 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* Sets the initial capacity. Should only be invoked by constructors.
*
* @param initialCapacity of the array
* @throws IllegalArgumentException if <code>initialCapacity</code> is not
* @throws MathIllegalArgumentException if <code>initialCapacity</code> is not
* positive.
*/
protected void setInitialCapacity(int initialCapacity) {
protected void setInitialCapacity(int initialCapacity) throws MathIllegalArgumentException {
if (initialCapacity > 0) {
synchronized(this) {
this.initialCapacity = initialCapacity;
@ -769,9 +772,9 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* array. This function will also expand the internal array as needed.
*
* @param i a new number of elements
* @throws IllegalArgumentException if <code>i</code> is negative.
* @throws MathIllegalArgumentException if <code>i</code> is negative.
*/
public synchronized void setNumElements(int i) {
public synchronized void setNumElements(int i) throws MathIllegalArgumentException {
// If index is negative thrown an error
if (i < 0) {
@ -862,9 +865,14 @@ public class ResizableDoubleArray implements DoubleArray, Serializable {
* @since 2.0
*/
public synchronized ResizableDoubleArray copy() {
ResizableDoubleArray result = new ResizableDoubleArray();
copy(this, result);
return result;
try {
ResizableDoubleArray result = new ResizableDoubleArray();
copy(this, result);
return result;
} catch (NullArgumentException e) {
// this should never happen
throw new MathInternalError(e);
}
}
/**