一,异常初步介绍
java异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器。
java的异常层次结构如图:
Error类层次结构:描述了Java运行时系统的内部错误和资源耗尽错误,这种错误不应该被抛出。这种时候应该分析程序本身的问题,如是否递归调用太多导致栈溢出等。Exception分为两层,由程序异常导致的错误RuntimeException,以及由于像I/O错误这类错误导致的异常属于其它异常。
记住一句规则:“如果出现RuntimeException异常,那么就一定是你的问题。”这里的问题是指程序本身的问题。举个例子,图中属于RuntimeException自雷的异常ArrayIndexOutOfBoundsException(数组越界异常)是由于程序访问了数组范围外的元素导致的异常,这种异常就是编写的程序导致的异常。应该通过检测数组下标是否越界来避免ArrayIndexOutOfBoundsException,这个任务应该由程序员完成。
java语言规范将派生与Error类或RuntimeException类的所有异常成为未检查异常,所有其它的异常成为已检查异常。编译器将核查是否为所有的已检查异常提供了异常处理器。
以下四种情况应该抛出异常:
1. 调用一个抛出已检查异常的方法,例如,FileInputStream构造器。
2. 程序运行过程中发生错误,并且利用语句抛出一个已检查错误。
3. 程序出现错误。
4. java虚拟机和运行时库出现的内部错误。
一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。
创建异常类:定义一个派生于Exception的类,即采用继承的思路。习惯上,定义的类应该包含两个构造器,一个是默认的构造器,一个是带有详细描述信息的构造器。
使用异常机制的几个技巧:
1. 异常处理不能代替简单的测试
2. 不要过分地细化异常
3. 利用异常层次结构
4. 不要压制异常
5. 早抛出,晚捕获