六.异常处理
6.1 finally块中的代码什么时候被执行
- finally在执行return前执行
- 程序在执行到return时会将返回值存放在一个指定位置,再去执行finally,最后再返回,所以即时在finally中修改了返回值,返回值仍然不变,因为事先已经存放好了。这是对于基本数据类型来说,对于引用数据类型的数据来说,仍然会改变。
- finally是否一定会执行?
- 不一定,若在进入try语句块前就抛出了异常,就不会执行finally
- 若执行了exit()强制结束程序,也不会执行finally
6.2 异常处理的原理是什么
- 当程序运行时,发生了非正常情况或错误,jvm就会将出现的错误表示为一个异常并抛出,这个异常可以在catch中进行捕获,然后进行处理,异常处理的目的是提高程序的鲁棒性和安全性。
- Throwable作为所有异常的父类,其中Error,Exception,RuntimeException都是其子类。
- 允许程序员自定义异常
6.3 运行时异常和普通异常有什么区别
- java有两种异常类,Error和Exception,他们有共同的父类,Throwable
- Error属于运行期间发生了严重的错误,该错误时不可恢复的,属于JVM层次的严重错误,会导致程序终止运行,编译器不会检查Error是否被处理,因此不建议捕获Error(OurtOfMemoryError、ThreadDeath)。当这些异常发生时,JVM会选择将线程终止。
- Exception表示可恢复的异常,编译器可以捕捉到,含两种类型,检查异常,运行时异常
- 检查异常
- 一种常见的异常,例如IO异常和SQL异常,这种异常发生在编译阶段,编译器强制去捕捉的异常。
- 这种异常发生后并不会导致程序出错,处理后可继续运行,如当链接数据库失败后,可重新连接后继续操作
- 程序以来不可靠的外部条件,如系统IO,则需要检查异常
- 运行时异常
- 编译器不需要强制去捕捉的异常,出现这种情况JVM会处理,常见的有空指针异常,类型转换异常,数组脚标越界异常,数组存储异常,缓冲区溢出异常,算术溢出等。
- 出现异常后系统会向上抛,直到遇到处理代码为止。
- 若不对异常进行处理会导致线程终止,或主程序终止
- 需要注意的几点
- 捕捉时,先捕捉子类异常,若先捕捉父类异常,则处理子类异常的处理代码就会失效
- 尽早抛出异常,且能处理就处理