package java.lang;

import ej.annotation.Nullable;

/**
 * Signals that an unexpected exception has occurred in a static initializer. An
 * <code>ExceptionInInitializerError</code> is thrown to indicate that an exception occurred during
 * evaluation of a static initializer or the initializer for a static variable.
 *
 * <p>
 * As of release 1.4, this exception has been retrofitted to conform to the general purpose
 * exception-chaining mechanism. The "saved throwable object" that may be provided at construction
 * time and accessed via the {@link #getException()} method is now known as the <i>cause</i>, and
 * may be accessed via the {@link Throwable#getCause()} method, as well as the aforementioned
 * "legacy method."
 */
public class ExceptionInInitializerError extends LinkageError {

	/**
	 * Constructs an <code>ExceptionInInitializerError</code> with <code>null</code> as its detail
	 * message string and with no saved throwable object. A detail message is a String that describes
	 * this particular exception.
	 */
	public ExceptionInInitializerError() {
		throw new RuntimeException();
	}

	/**
	 * Constructs an ExceptionInInitializerError with the specified detail message string. A detail
	 * message is a String that describes this particular exception. The detail message string is saved
	 * for later retrieval by the {@link Throwable#getMessage()} method. There is no saved throwable
	 * object.
	 *
	 *
	 * @param s
	 *        the detail message
	 */
	public ExceptionInInitializerError(String s) {
		throw new RuntimeException();
	}

	/**
	 * Constructs a new <code>ExceptionInInitializerError</code> class by saving a reference to the
	 * <code>Throwable</code> object thrown for later retrieval by the {@link #getException()} method.
	 * The detail message string is set to <code>null</code>.
	 *
	 * @param thrown
	 *        The exception thrown
	 */
	public ExceptionInInitializerError(Throwable thrown) {
		throw new RuntimeException();
	}

	/**
	 * Returns the cause of this error (the exception that occurred during a static initialization that
	 * caused this error to be created).
	 *
	 * @return the cause of this error or <code>null</code> if the cause is nonexistent or unknown.
	 */
	@Override
	@Nullable
	public Throwable getCause() {
		throw new RuntimeException();
	}

	/**
	 * Returns the exception that occurred during a static initialization that caused this error to be
	 * created.
	 *
	 * <p>
	 * This method predates the general-purpose exception chaining facility. The
	 * {@link Throwable#getCause()} method is now the preferred means of obtaining this information.
	 *
	 * @return the saved throwable object of this <code>ExceptionInInitializerError</code>, or
	 *         <code>null</code> if this <code>ExceptionInInitializerError</code> has no saved throwable
	 *         object.
	 */
	@Nullable
	public Throwable getException() {
		throw new RuntimeException();
	}
}
