diff --git a/src/java/org/apache/commons/math/MathException.java b/src/java/org/apache/commons/math/MathException.java index 6f2c363b5..d7ee962f7 100644 --- a/src/java/org/apache/commons/math/MathException.java +++ b/src/java/org/apache/commons/math/MathException.java @@ -16,47 +16,133 @@ package org.apache.commons.math; import java.io.Serializable; +import java.io.PrintStream; +import java.io.PrintWriter; -import org.apache.commons.lang.exception.NestableException; /** - * A generic exception indicating problems in the math package. - * @version $Revision: 1.17 $ $Date: 2004/06/23 16:26:16 $ - */ -public class MathException extends NestableException implements Serializable { - +* Base exception class for commons-math. +*
+* Supports nesting, emulating JDK 1.4 behavior if necessary. +*
+* Adapted from {@link org.apache.commons.collections.FunctorException}.
+*
+* @version $Revision: 1.18 $ $Date: 2004/07/10 22:21:36 $
+*/
+public class MathException extends Exception {
+
/** Serializable version identifier */
static final long serialVersionUID = -8594613561393443827L;
/**
- * Constructs a MathException
+ * Does JDK support nested exceptions?
+ */
+ private static final boolean JDK_SUPPORTS_NESTED;
+
+ static {
+ boolean flag = false;
+ try {
+ Throwable.class.getDeclaredMethod("getCause", new Class[0]);
+ flag = true;
+ } catch (NoSuchMethodException ex) {
+ flag = false;
+ }
+ JDK_SUPPORTS_NESTED = flag;
+ }
+
+ /**
+ * Root cause of the exception
+ */
+ private final Throwable rootCause;
+
+ /**
+ * Constructs a new MathException
with no
+ * detail message.
*/
public MathException() {
- this(null, null);
+ super();
+ this.rootCause = null;
+ }
+
+ /**
+ * Constructs a new MathException
with specified
+ * detail message.
+ *
+ * @param msg the error message.
+ */
+ public MathException(String msg) {
+ super(msg);
+ this.rootCause = null;
+ }
+
+ /**
+ * Constructs a new MathException
with specified
+ * nested Throwable
root cause.
+ *
+ * @param rootCause the exception or error that caused this exception
+ * to be thrown.
+ */
+ public MathException(Throwable rootCause) {
+ super((rootCause == null ? null : rootCause.getMessage()));
+ this.rootCause = rootCause;
+ }
+
+ /**
+ * Constructs a new MathException
with specified
+ * detail message and nested Throwable
root cause.
+ *
+ * @param msg the error message.
+ * @param rootCause the exception or error that caused this exception
+ * to be thrown.
+ */
+ public MathException(String msg, Throwable rootCause) {
+ super(msg);
+ this.rootCause = rootCause;
+ }
+
+ /**
+ * Gets the cause of this throwable.
+ *
+ * @return the cause of this throwable, or null
+ */
+ public Throwable getCause() {
+ return rootCause;
+ }
+
+ /**
+ * Prints the stack trace of this exception to the standard error stream.
+ */
+ public void printStackTrace() {
+ printStackTrace(System.err);
+ }
+
+ /**
+ * Prints the stack trace of this exception to the specified stream.
+ *
+ * @param out the PrintStream
to use for output
+ */
+ public void printStackTrace(PrintStream out) {
+ synchronized (out) {
+ PrintWriter pw = new PrintWriter(out, false);
+ printStackTrace(pw);
+ // Flush the PrintWriter before it's GC'ed.
+ pw.flush();
+ }
+ }
+
+ /**
+ * Prints the stack trace of this exception to the specified writer.
+ *
+ * @param out the PrintWriter
to use for output
+ */
+ public void printStackTrace(PrintWriter out) {
+ synchronized (out) {
+ super.printStackTrace(out);
+ if (rootCause != null && JDK_SUPPORTS_NESTED == false) {
+ out.print("Caused by: ");
+ rootCause.printStackTrace(out);
+ }
+ }
}
- /**
- * Create an exception with a given error message.
- * @param message message describing the problem
- */
- public MathException(final String message) {
- this(message, null);
- }
-
- /**
- * Create an exception with a given error message and root cause.
- * @param message message describing the problem
- * @param throwable caught exception causing this problem
- */
- public MathException(final String message, final Throwable throwable) {
- super(message, throwable);
- }
-
- /**
- * Create an exception with a given root cause.
- * @param throwable caught exception causing this problem
- */
- public MathException(final Throwable throwable) {
- this(null, throwable);
- }
}