java中的异常(Exception)
1 异常为何物:
A 为非正常的,不同于平常的
B 本身是一个对象,是程序退出的安全通道
C 可以使程序的执行流程发生改变,让程序的控制权转移到异常处理器
2 异常的产生
A 异常(Exception)就是程序在运行过程中发生的由于硬件、软件错误等导致的程序不正常事件
B 程序代码本身的原因造成的错误理论上可以避免,有些如内存不足,文件操作等错误是不可预测,与运行环境有关
3 异常的类型
A 编译时异常
B 运行时异常
4 异常的处理
A 通过try…catch语句进行捕获异常
遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象
调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码
B throws --- 声明异常
throw --- 抛出异常
try&catch --- 捕获异常
finally --- 其中的代码在try中语句结束前执行,finally子句是可选的
C 传统的处理异常的办法是:用函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有有一定的弊端:
如函数返回-1代表出现异常,但是假如函数确实要返回-1这个正确的值时就会出现混淆;
将程序代码与处理异常的代码混在一起,使得可读性降低;
由调用函数的程序来分析错误,这就要求程序员对库函数有很深的了解 ;
5 常见的异常
A Error体系
Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形;
应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出);
如果出现这种错误,除了尽力使程序安全退出外,在其它方面是无能为力的。
所以说,在进行程序设计时,应该更关注Exception体系
B Exception体系
Exception体系包括RuntimeException体系和其它非RuntimeException的体系
C RuntimeException体系
包括错误的类型转换、数组越界访问和试图访问空指针等等;
如果出现RuntimeException,那么一定是程序员的错误;
通过检查数组下标和数组边界来避免数组越界访问异常
D 其他(一般是外部错误如:IOException等等)
异常,如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误
6 需要注意的地方
A 异常都是从类Throwable派生出来
B 尽可能捕获具体的异常,出错时便于查找
C 捕获的异常时,范围应该从小到大
D 捕获的异常时,若try中的代码产生多种异常则可以对应多个catch语句
E 异常让子类(更特殊的类)先处理,如果处理不了,再有父类进行处理
F 若catch中的参数类型有父类子类关系,此时应该将父类放在后面,子类放在前面先处理
G 覆盖父类某方法的子类方法,不能抛出比父类方法更多的异常;
在设计父类的方法时抛出异常,但实际的实现方法的代码却并不抛出异常;
这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常
H 异常对象通常有两种构造函数:一种是无参数的构造函数;
另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明
I 如果一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;
对于一个图形界面程序,也会输出异常的信息,但是程序并不中止
J 异常处理5个关键字:try、catch、throw、throws和finally