异常
java的异常层次结构
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误.引用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了.
在设计Java程序时,需要关注Exception层次结构.这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常.划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常.
派生于RuntimeException的异常包含下面几种情况:
1.错误的类型转换
2.数据访问越界
3.访问空指针
不是派生于RuntimeException的异常包括:
1.试图在文件尾部后面读取数据
2.试图打开一个不存在的文件
3.试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在.
"如果出现RuntimeException异常,那么就一定是你的问题"是一条相当有道理的规则.应该通过检测数组下标是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生.
Java语言将派生于Error类或RuntimeException类的所有异常称为未检查异常,所有其他的异常称为已检查异常.
RuntimeException这个名字很容易让人误解,他并不是运行时异常的意思。
调用一个抛出了已检查异常的方法,编译器必须要处理这个异常,要么捕获,要么抛出。
调用一个未检查异常方法,编译器不要求必须处理这个异常。如下:
红线是编译报错,需要捕获异常才可以。
为什么我们不需要捕获未检查异常?
因为大部分情况下未检查异常一般是程序错误,超出了我们的处理范围。应该在程序编写期间,就避免这种异常,而不是把它抛出给上层。比如我们需要处理ArrayIndexOutOfBoundsException异常吗,不需要,这是在编码阶段就需要避免出现的问题。