Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的概述,请参见Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项,请参见JDK发行说明。
在捕获异常之前,某个地方的代码必须抛出异常。任何代码都可以抛出异常:你的代码、由其他人编写的包中的代码(如Java平台提供的包)或Java运行时环境。无论什么地方抛出异常,都是通过throw
语句抛出的。
你可能已经注意到,Java平台提供了许多异常类。所有的类都是Throwable
类的子类,它们允许程序在执行过程中区分各种类型的异常。
你还可以创建自己的异常类,以表示你编写的类中可能发生的问题。事实上,如果你是一个包开发者,你可能需要创建自己的一套异常类,以便用户能够区分出在你的包中可能发生的错误与在Java平台或其他包中发生的错误。
你还可以创建链接的异常。更多信息,请参阅链接的异常部分。
所有方法都使用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有两个直接子类:Error
和Exception
。
Throwable类。
当Java虚拟机发生动态链接失败或其他严重故障时,虚拟机会抛出一个Error
。简单的程序通常不会捕获或抛出Error
。
大多数程序会抛出和捕获从Exception
类派生的对象。一个Exception
表示发生了问题,但它不是一个严重的系统问题。您编写的大多数程序将抛出和捕获Exception
,而不是Error
。
Java平台定义了许多Exception
类的子类。这些子类表示可能发生的各种类型的异常。例如,IllegalAccessException
表示找不到特定的方法,而NegativeArraySizeException
表示程序试图创建一个负大小的数组。
一个Exception
的子类RuntimeException
专门用于表示API的错误使用。一个运行时异常的例子是NullPointerException
,它发生在一个方法尝试通过一个null
引用访问对象的成员时。章节Unchecked Exceptions — The Controversy讨论了为什么大多数应用程序不应该抛出运行时异常或子类化RuntimeException
。