文档

Java™ 教程
隐藏目录
如何抛出异常
导航: Java基础类
课程: 异常

如何抛出异常

在捕获异常之前,某个地方的代码必须抛出异常。任何代码都可以抛出异常:你的代码、由其他人编写的包中的代码(如Java平台提供的包)或Java运行时环境。无论什么地方抛出异常,都是通过throw语句抛出的。

你可能已经注意到,Java平台提供了许多异常类。所有的类都是Throwable类的子类,它们允许程序在执行过程中区分各种类型的异常。

你还可以创建自己的异常类,以表示你编写的类中可能发生的问题。事实上,如果你是一个包开发者,你可能需要创建自己的一套异常类,以便用户能够区分出在你的包中可能发生的错误与在Java平台或其他包中发生的错误。

你还可以创建链接的异常。更多信息,请参阅链接的异常部分。

throw语句

所有方法都使用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不是一个受检异常,所以不需要声明可能会发生它。

Throwable类及其子类

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

Throwable类及其最重要的子类。

Throwable类。

Error类

当Java虚拟机发生动态链接失败或其他严重故障时,虚拟机会抛出一个Error。简单的程序通常不会捕获或抛出Error

Exception类

大多数程序会抛出和捕获从Exception类派生的对象。一个Exception表示发生了问题,但它不是一个严重的系统问题。您编写的大多数程序将抛出和捕获Exception,而不是Error

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

一个Exception的子类RuntimeException专门用于表示API的错误使用。一个运行时异常的例子是NullPointerException,它发生在一个方法尝试通过一个null引用访问对象的成员时。章节Unchecked Exceptions — The Controversy讨论了为什么大多数应用程序不应该抛出运行时异常或子类化RuntimeException


上一页: 指定方法抛出的异常
下一页: 链式异常