在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()用于为不支持前述附加构造函数的遗留类设置一个原因异常.
链式异常并不是所有程序都需要的.然而,万一需要知道异常的根本原因,链式异常能够提供一个很好的解决方法.