如何引发异常

在catch异常之前,某些地方的某些代码必须抛出一个。任何代码都可能引发异常:您的代码,其他人编写的程序包中的代码,例如 Java 平台附带的程序包或 Java 运行时环境。无论引发什么异常,它始终与throw语句一起引发。

您可能已经注意到,Java 平台提供了许多异常类。所有这些类都是Throwable类的后代,并且所有类都允许程序区分在程序执行期间可能发生的各种类型的异常。

您也可以创建自己的异常类来表示您编写的类中可能发生的问题。实际上,如果您是程序包开发人员,则可能必须创建自己的异常类集,以允许用户将程序包中可能发生的错误与 Java 平台或其他程序包中发生的错误区分开。

您也可以创建* chained *异常。有关更多信息,请参见Chained Exceptions部分。

投掷声明

所有方法都使用throw语句引发异常。 throw语句仅需一个参数:可抛出对象。可抛出对象是Throwable类的任何子类的实例。这是throw语句的示例。

throw someThrowableObject;

让我们在上下文中查看throw语句。以下pop方法来自实现通用堆栈对象的类。该方法从堆栈中删除顶部元素,并返回对象。

public Object pop() {
    Object obj;

    if (size == 0) {
        throw new EmptyStackException();
    }

    obj = objectAt(size - 1);
    setObjectAt(size - 1, null);
    size--;
    return obj;
}

pop方法检查堆栈中是否有任何元素。如果堆栈为空(其大小等于0),则pop实例化一个新的EmptyStackException对象(java.util的成员)并将其抛出。本章的创建异常类部分说明了如何创建自己的异常类。现在,您只需要记住,您只能抛出从java.lang.Throwable类继承的对象。

请注意,pop方法的声明不包含throws子句。 EmptyStackException不是已检查的异常,因此不需要pop声明它可能会发生。

Throwable 类及其子类

Throwable类继承的对象包括直接后代(直接从Throwable类继承的对象)和间接后代(从Throwable类的子代或孙代继承的对象)。 下的图说明了Throwable类的类层次结构及其最重要的子类。如您所见,Throwable有两个直接后代:ErrorException

Throwable 类及其最重要的子类。

Throwable 类。

Error Class

当 Java 虚拟机中发生动态链接故障或其他硬故障时,虚拟机将抛出Error。简单的程序通常不会catch或抛出Error s。

Exception Class

大多数程序会抛出并catch从Exception类派生的对象。 Exception表示发生了问题,但这不是严重的系统问题。您编写的大多数程序都会抛出Exception而不是Error s。

Java 平台定义了Exception类的许多后代。这些后代指示可能发生的各种类型的异常。例如,IllegalAccessException表示找不到特定的方法,而NegativeArraySizeException表示程序试图创建一个具有负大小的数组。

保留一个Exception子类RuntimeException,用于表示错误使用 API 的异常。 NullPointerException是运行时异常的一个示例,当方法试图通过null引用访问对象的成员时会发生。 未经检查的 exceptions-争议部分讨论了为什么大多数应用程序不应引发运行时异常或RuntimeException子类。