1. 顶级错误类Throwable
其子类有:
1. Error : 指的是在程序因为设计问题导致程序崩溃错误,如内存泄漏等,这里暂不考虑这种错误
2. Exception :指的是在程序中正常情况下运行时没有任何问题,但在一些特定情况下会出现一些异常情况,如:数组越界、空指针等,其又分为两种异常(这里主要讨论Exception)。
* 运行时异常(非检查型异常):指在运行过程中,程序出现的错误,如:数组越界。
* 非运行时异常(检查型异常):程序设计时,可能会遇到的一些错误,如:io读取异常,文件不存在等,需要提前进行检查处理
2. 异常的处理策略
异常 --> 在堆上创建一个异常对象 --> 返回引用 --> 在合适的地方处理(可以是自行catch或者向上抛出,交给java虚拟机进行处理)
java中提供了try..catch语句块,及throw/throws关键字,getStackTrace()方法,异常链,finally代码块
异常产生就是所需数据无法正确的得到,所以设计异常之初有两种处理的考虑:
1. 当程序出现异常时,将异常获取到,对出现异常进行处理,使其能够恢复到正常情况继续运行,所付出的代价是需要进行不断的循环处理,使异常代码能够得到正确的数据,但由于花费代价太高,每种异常情况都要去考虑设计,开销太大,只好放弃
2. 将程序出现异常处进行捕获/抛出,使程序运行终止
2.1 try...catch语句块用法
为了使异常处理代码与正常逻辑代码分离,在try块中编写正常代码,在catch中进行异常处理
try中出现异常后的代码无法执行,得到中断,进行catch处理后,代码块外的代码得到执行....
2.2 throw/throws用法
当出现异常时,可以将异常向上抛出,最终由上层代码进行捕获处理
2.3 Exception中的getStackTrace方法
这个方法会得到执行线程栈中的所有栈帧,(栈帧就是没调用一个方法,就会向栈中压入一个栈帧其中包括执行的方法,返回值,形参等),可将其遍历,得到程序执行的调用结果
只截取了部分结果,最先执行的方法,最后打印,栈是先进后出
2.4 异常链
使用多层catch进行异常捕获,子类在父类前进行捕获,否则会被父类异常所覆盖
若将异常捕获后,重新创建一个异常进行抛出,会将之前的异常信息所覆盖,这时,可以使用Exception中的initCause方法将之前的异常信息保存延续下去
正常得出异常所产生的位置,如果没有使用initCause方法的话,异常的产生就会在第90行而不是85行
2.5. finally块
在try...catch块后面还可以跟一个finally语句块,其作用为:无论是否异常都会在代码块结束执行前执行finally代码块中的代码(所以常用来对资源进行释放)
3. 自定义异常
自定义异常可以通过继承Exception类进行创建,默认有两个构造参数,一个无参和一个带有string信息的有参构造
这样就实现了一个自定义异常类,如需添加一些信息记录,可自行设置
注意:如果自定义异常继承的是Exception类,没有指定明确类型的异常如RunTimeException等,在代码块中执行方法等未抛出自定义异常是不能通过编译的,如:
如果自定义异常指定了类型,就不会出现问题
如有错误,欢迎指正。
参考自:thinking in java