# 如何抛出例外

> 原文： [https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html)

在捕获异常之前，某些代码必须抛出一个。任何代码都可以抛出异常：您的代码，来自其他人编写的包中的代码，例如 Java 平台附带的包或 Java 运行时环境。无论什么抛出异常，它总是抛出`throw`语句。

您可能已经注意到，Java 平台提供了许多异常类。所有类都是 [`Throwable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html) 类的后代，并且所有类都允许程序区分在程序执行期间可能发生的各种类型的异常。

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

您还可以创建 _ 链式 _ 例外。有关更多信息，请参阅[链式异常](../../essential/exceptions/chained.html)部分。

## 抛出声明

所有方法都使用`throw`语句抛出异常。 `throw`语句需要一个参数：一个 throwable 对象。可抛出的对象是`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`的成员）并抛出它。本章中的[创建异常类](../../essential/exceptions/creating.html)部分介绍了如何创建自己的异常类。现在，您需要记住的是，您只能抛出从`java.lang.Throwable`类继承的对象。

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

## 可抛出的类及其子类

从`Throwable`类继承的对象包括直接后代（直接从`Throwable`类继承的对象）和间接后代（从`Throwable`类的子孙继承的对象）。 下图说明了`Throwable`类的类层次结构及其最重要的子类。如您所见，`Throwable`有两个直接后代： [`Error`](https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html) 和 [`Exception`](https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html) 。

<center>![The Throwable class and its most significant subclasses.](img/84d504625ecc17df1827f19bf2d79a03.jpg)

Throwable 类。

</center>

## 错误类

当发生 Java 虚拟机中的动态链接故障或其他硬故障时，虚拟机将抛出`Error`。简单的程序通常会 _ 而不是 _ 捕获或抛出`Error`。

## 例外类

大多数程序抛出并捕获从`Exception`类派生的对象。 `Exception`表示发生了问题，但这不是一个严重的系统问题。你编写的大多数程序都会抛出并捕获`Exception`，而不是`Error`。

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

一个`Exception`子类`RuntimeException`保留用于指示错误使用 API​​的异常。运行时异常的一个示例是`NullPointerException`，当方法尝试通过`null`引用访问对象的成员时发生。 [未经检查的异常 - 争议](runtime.html)部分讨论了为什么大多数应用程序不应该抛出运行时异常或子类`RuntimeException`。