Java的内置异常

在java.lang标准包内,Java定义了几个异常类.其中一些异常类已经在前面的示例中用过了.这些异常中最常用的是标准类型RuntimeException的子类.因为所有的Java程序都隐式的引入了java.lang,所以从RuntimeException派生的多数异常都自动有效,而且他们不需要被引入到任何方法的throws列表中.在Java语言中,因为编译器不检查方法是否处理或抛出这些异常,所以他们被称为未检查异常(unchecked exception).java.lang中定义的非检查异常如下表所示:
异常
含义
ArithmeticException
运算错误,如整数除以0
ArrayIndexOutOfBoundsException
数组索引越界
ArrayStoreException
向类型不兼容的数组元素赋值
ClassCastException
无效的强制转换
EnumConstantNotPresentException
试图使用未定义的枚举值
IllegalArgumentException
使用非法实参调用方法
IllegalMonitorStateException
非法的监视器操作,如等待未锁的线程
IllegalStateException
环境或应用程序处于不正确的状态
IllegalThreadStateException
被请求的操作与当前线程状态不兼容
IndexOutOfBoundsException
某种类型的索引越界
NegativeArraySizeException
在负数范围内创建的数组
NullPointerException
对null引用的无效使用
NumberFormatException
字符串到数字格式的无效转换
SecurityException
试图违反安全性
StringIndexOutOfBoundsException
试图在字符串界外索引
TypeNotPresentException
类型未找到
UnsupportedOperationException
遇到不支持的操作
下表列出的是由java.lang定义的另外一些异常,如果方法可以产生这些异常却无法对其进行处理,就必须在该方法的throws列表中列出.这种异常称为检查异常.除了Java.lang中定义的异常外,Java还定义了几种与其他包相关的异常类型,如前面提到的IOException异常.
异常
含义
ClassNotFoundException
没有找到类
CloneNotSupportedException
视图复制没有实现Cloneable接口的对象
IllegalAccessException
访问类被拒绝
InstantiationException
试图创建抽象类或接口的对象
InterruptedException
线程已经被另一个线程中断
NoSuchFieldException
请求的域不存在
NoSuchMethodException
请求的方法不存在
ReflectiveOperationException
与反射有关的异常的超类
问:我听说Java支持链式异常(chained exception),什么是链式异常呢?
答:链式异常是JDK1.4引入的,链式异常功能允许将一个异常指定为另一个异常发生的条件.例如,试想一下这种情况,因为试图除以0使得方法抛出ArithmeticException异常.然而,问题的真正原因是发生了I/O错误使得除数被错误设定.尽管因为发生了这样的错误,方法肯定会抛出ArithmeticException异常,但是你可能也想让调用代码得知根本原因是I/O错误.链式异常就可以解决这个问题以及其他存在异常层次的情况.为使用链式异常,向Throwable添加了两个构造函数和两个方法.这两个构造函数如下所示:
在第一种形式中,causeExc是导致当前异常的异常,即causeExc是异常发生的根本原因.第二种形式允许在指定原因异常的同时进行描述.这两个构造函数都被添加到了Error,Exception和RuntimeException.
添加到Throwable的链式异常方法getCause()和initCause().这两个方法如下所示:
Throwable getCause()
Throwable initCause(Throwable causeExc)
getCause()方法返回导致当前异常的异常.如果没有原因异常,则返回null,initCause()方法将causeExc与调用异常建立关联,并返回一个对异常的引用.因此可以在创建异常后将一个原因与其关联.总之,initCause()用于为不支持前述附加构造函数的遗留类设置一个原因异常.
链式异常并不是所有程序都需要的.然而,万一需要知道异常的根本原因,链式异常能够提供一个很好的解决方法.