第十二章 通过异常处理错误
1.概念
- 异常允许我们强制程序停止运行,并告诉我们出现了什么问题,或者强制程序处理问题,并返回到稳定状态。
2.捕获异常
try{ //可能会出现异常的代码 }catch(Exception e){ //捕获到异常后需要执行的代码,可以做日志记录 e.printStackTrace(); }finally{ //无论是否捕获到异常都会执行的语句块 } //一个try语句块后面能跟多个catch语句块,若果有多个异常需要捕获,最好按照从小(精确)的异常到大(模糊)的异常顺序catch,以防最大的异常提钱捕获到精确类型异常。
3.创建自定义异常
要自定义异常类,必须从已有的异常类继承。
public class MyException extends Exception{}
4.栈轨迹
- printStackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一帧。元素0是栈顶元素,并且是调用序列中的最后一个方法调用(这个Throwable被创建和抛出之外)。数组中的最后一个元素和栈底是调用序列中的第一个方法调用。
5.重新抛出异常
- 使用throw来抛出一个异常对象,这个对象抛给上一级程序。
- 异常链
在Throwable子类中,只有三种基本的异常类提供了带cause参数的的构造器。他们是Error(用于Java虚拟机报告系统错误)、Exception以及RuntimeException。如果要把其它类型的异常链接起来,应该使用initCause()方法而不是构造器。
-Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):Error用来表示编译时和系统错误(除特殊情况外,一般不用关心);Exception是可以被抛出的基本类型,在Java类库、用户方法以及运行时故障中都可能抛出Exception型异常。
6.finally
finally语句块中的代码是无论如何都会被执行(即使涉及break、continue;会撤销掉涉及到的return),这个语句块通常被用来做内存释放。
7.异常使用指南
- 在恰当的级别处理问题。(在知道该如何处理的情况下才捕获异常)
- 解决问题并且重新调用产生异常的方法。
- 进行少许修补,然后绕过异常发生的地方继续执行。
- 用别的数据进行计算,以替代方法预计会返回的值。
- 把当前运行环境下能做的事情尽量做完,然后把异常抛到更高层。
- 终止程序。
- 进行简化。
- 让类库和程序更安全。
8.延伸
8.1 final、finally与finalize的区别
- 1)
final
Java中,final用作修饰词,可以修饰域、方法、类。用来修饰类表示该类不能被继承,并且类中的方法和域都隐式的被final修饰;修饰方法表示该方法不能被override;修饰域表示该域为常量。- 2)
finally
finally作为异常处理中的一个语句块,依赖于try/catch存在,表示一段无论如何都会执行的代码。- 3)
finalize
finalize()方法实在Object中定义的,每个对象都会有这么一个方法,此方法的作用是建议gc回收掉该对象。8.2 throw与throws的区别
- 抛出异常有三种形式:1)系统自动抛出异常。2)throw。3)throws。
- 系统自动抛异常
当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常.- throw
throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。- throws
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常。- throw与throws的区别
1)throws出现在方法函数头;而throw出现在函数体。
2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3)两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。