package java.lang;

import ej.annotation.Nullable;

/**
 * Thrown when an application tries to load in a class through its string name using:
 * <ul>
 * <li>The <code>forName</code> method in class <code>Class</code>.
 * <li>The <code>findSystemClass</code> method in class <code>ClassLoader</code> .
 * <li>The <code>loadClass</code> method in class <code>ClassLoader</code>.
 * </ul>
 * <p>
 * but no definition for the class with the specified name could be found.
 *
 * <p>
 * As of release 1.4, this exception has been retrofitted to conform to the general purpose
 * exception-chaining mechanism. The "optional exception that was raised while loading the class"
 * 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."
 *
 * @see java.lang.Class#forName(java.lang.String)
 */
public class ClassNotFoundException extends ReflectiveOperationException {

    /**
     * Constructs a <code>ClassNotFoundException</code> with no detail message.
     */
    public ClassNotFoundException() {
        throw new RuntimeException();
    }

    /**
     * Constructs a <code>ClassNotFoundException</code> with the specified detail message.
     *
     * @param s
     *        the detail message.
     */
    public ClassNotFoundException(String s) {
        throw new RuntimeException();
    }

    /**
     * Constructs a <code>ClassNotFoundException</code> with the specified detail message and optional
     * exception that was raised while loading the class.
     *
     * @param s
     *        the detail message
     * @param ex
     *        the exception that was raised while loading the class
     */
    public ClassNotFoundException(String s, Throwable ex) {
        throw new RuntimeException();
    }

    /**
     * Returns the cause of this exception (the exception that was raised if an error occurred while
     * attempting to load the class; otherwise <code>null</code>).
     *
     * @return the cause of this exception.
     */
    @Override
    @Nullable
    public Throwable getCause() {
        throw new RuntimeException();
    }

    /**
     * Returns the exception that was raised if an error occurred while attempting to load the class.
     * Otherwise, returns <code>null</code>.
     *
     * <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 <code>Exception</code> that was raised while loading a class
     */
    @Nullable
    public Throwable getException() {
        throw new RuntimeException();
    }
}
