
5.4 Java基础包中定义的常用异常类
在Java体系的异常处理机制中,异常是以类对象的形式出现的,通过类描述异常可以封装有关异常的所有信息,为异常的处理提供方便。与所有Java类都是由java.lang.Object类派生出来的一样,所有被确定描述异常的类都是java.lang.Throwable类派生出来的,包括Java类库提供的异常类和自定义的异常类,Java体系制定的异常处理机制就是针对这些类创建的对象进行处理的,因此,只有Throwable类及其派生类才适合Java的异常处理机制。
5.4.1 异常类的根类与直接子类
在Java基础包java.lang中定义的Throwable异常类是所有异常类的根类,但它同样也是java.lang.Object的子类,在Throwable类中定义了一些与异常相关的操作方法,同时还继承了Object类的所有方法,Throwable类中的常用方法和操作功能如表5-1所示。
表5-1 Throwable类中常用方法及其操作功能说明

在Java基础包java.lang中定义了许多常用的Throwable类的子类,其中Exception和Error类是Throwable类的直接子类,Throwable类也只有这两个直接子类。Exception异常类是可以捕获及修正的,因此,Exception异常类及其派生类是适合Java的异常捕获、传播及修正处理的。Exception类定义的方法和操作如表5-2所示。
表5-2 Exception类中常用方法及其功能说明

从制定Java异常处理机制的原则可知,所有从Throwable类派生的子类异常对象都适合使用该机制进行处理,但是,在Java包中定义的Error类及其派生类,一般描述的是应用程序致命的严重错误,基本上是Java虚拟机产生的与其相关的、不可逆转的错误,发生Error异常将会导致应用程序中断,一般在应用程序中不对这类异常做处理,也无法进行处理,Error类定义的方法和功能如表5-3所示。
表5-3 Error类中常用方法及其功能说明

Exception和Error类的定义表明,它们只声明了各自的构造方法,没有添加属于自己类的方法,只是继承了父类的所有方法,并为其所拥有。Exception或Error类就是通过自身的构造方法创建Exception或Error对象,并通过该对象实现其父类所有方法的调用。
【示例5-10】 产生整数被0除和数组越界两个异常的程序,通过声明的Exception类对象e将各自的异常情况输出显示出来。其程序代码为:

以下是上述程序输出显示结果:

调用Throwable类方法:输出显示异常的各种信息。

调用Object类方法:

调用Throwable类方法:输出显示异常的各种信息。

调用Object类方法:

从程序的输出结果可以看出,Java虚拟机在处理异常时已经将各种异常进行了分类,这些异常的类正是对应Exception类的子类。
5.4.2 java.lang包中定义的具体异常类
在java.lang包中定义的Exception类的直接子类及其功能说明如表5-4所示。
表5-4 Exception类的直接子类及其功能说明

在java.lang包中定义的RuntimeException类的直接子类及其功能说明如表5-5所示。
表5-5 RuntimeException类的直接子类及其功能说明

在java.lang包中定义IllegalArgumentException类的直接子类及其功能说明如表5-6所示。
表5-6 IllegalArgumentException类的直接子类及其功能说明

在java.lang包中定义的IndexOutOfBoundsException类的直接子类及其功能说明如表5-7所示。
表5-7 IndexOutOfBoundsException类的直接子类及其功能说明

在java.lang包中定义的Error类的直接子类及其功能说明如表5-8所示。
表5-8 Error类的直接子类及其功能说明

在java.lang包中定义的LinkageError类的直接子类及其功能说明如表5-9所示。
表5-9 LinkageError类的直接子类及其功能说明

在java.lang包中定义的VirtualMachineError类的直接子类及其功能说明如表5-10所示。
表5-10 VirtualMachineError类的直接子类及其功能说明

在java.lang包中定义的IncompatibleClassChangeError类的直接子类及其功能说明如表5-11所示。
表5-11 IncompatibleClassChangeError类的直接子类及其功能说明

在java.lang包中,所有Exception和Error类的异常子类的定义基本上与Exception和Error类的定义是一样的,它们都是重新构造了各自子类的构造方法,其子类的内部方法则是继承了父类的方法。
除java.lang包外,在Java的所有类库中,每个包都定义了与该包中类库实现功能相关的异常类,当Java虚拟机执行操作代码出现异常时,它会创建一个与异常相关的异常对象,在异常对象中包含有关异常的各种信息,然后将异常对象抛出,提供给应用程序进行捕获、修正、再抛出等相关处理。因此,在使用Java类库中类的方法时应注意方法抛出的异常,并根据异常信息再做相应的异常处理。