第十二章 异常处理
一、Java异常
异常:运行期出现的错误
Java异常:Java提供的一种用于处理程序中错误的机制
Java对异常的封装——异常类
观察异常出现的位置、层次和异常的类型
程序是“调”出来的
java异常的父类是Throwable,Throwable有两个子类一个是Error,一个是Exception
二、运行时的错误与异常
Error类:及其子类表示程序本身无法修复的错误,通常是由Java虚拟机抛出的严重错误。一般不会被扩展自定义错误类
Exception类:及其子类处理程序运行过程中发生的异常事件
(1)小错误,编译器可以接受,但是是有问题的
(2)说明:设计良好的程序应在异常发生时提供处理错误的方法,程序不会因为错误发生而阻断或发生不可预见的错误
(3)默认的异常处理方法:将异常信息打印到控制台
三、检查异常与非检查异常
检查异常(Checked Exception):代码写出来就会直接报错,需要提前进行预处理
(1)范围:RuntimeException及其子类
(2)经常出现的异常,可以人为处理也可以不处理
(3)编程导致的错误,程序员的错误
非检查异常(Unchecked Exception):代码写出来不会报错,但是在运行时可能会报错。
(1)范围:RuntimeException及其子类以外的异常类
(2)方法定义后所加的Exception,必须要人为处理,否则编译报错
(3)程序无法避免的错误,不是程序员的错误
四、Java异常的处理机制
1.异常的声明(throws):方法告诉编译器该方法有可能发生的错误,可能抛出的异常——异常在方法声明后被抛出
2.异常地抛出(throw):运行时出现异常事件,生成对应的异常对象,该对象封装了异常的信息并被提交给Java运行时系统——异常在程序中被抛出
3.异常的捕获(catch):Java运行时系统接收到异常对象,会寻找处理异常的代码并交给其处理
4.如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出
5.如果被调方法发生异常,主调方法仍处理不了此异常,则此方法的上层主调方法处理,如果main方法仍无法处理此异常,则抛出异常:
(1)如当前不是主线程(main方法),则终止该线程,其它线程依然运行
(2)如当前是主线程,则终止整个应用程序
五、运用throws声明异常
1.声明异常:
(1)Java处理异常的一种方式
(2)方法中的代码在运行时可能出现异常,但本方法中不必或不能确定如何处理此类异常
2.一般形式
[修饰符] 返回值类型 方法名 (参数表列){}
3.该方法中不对此类异常进行处理,由该方法的主调方法处理
(1)抛出异常:主调方法抛出异常的范围必须不小于被调方法抛出的异常(必须包括被调方法抛出的异常或其父类异常)
(2)捕获异常
六、捕获异常
一般形式:
try{…}
catch(Exception1 e1){…}
catch(Exception2 e2){…}
…finally
[finally{…}]
注:
(1)每个语句块都可以嵌套try…catch…finally语句
(2)每个不同代码块中定义的变量的作用域为本代码块
如:try代码块中定义的变量的作用域为try代码块,不能在catch和finally代码块中使用
1.try代码块
(1)try代码块中包含可能产生异常的代码
(2)try代码块不能独立出现,必须和catch代码块、finally代码块搭配使用
(3)try代码块后可以跟零个或多个catch代码块,零个或一个finally代码块
(4)try代码块后可以只跟一个finally代码块
(5)异常发生时,停止执行try中代码
2.catch代码块
(1)catch代码块中写入如果出现异常,处理异常的代码
(2)声明的对象必须是Throwable或其子类类型
(3)获取异常信息的常用方法:
getMessage():输出异常的类型
printStackTrace():指出异常的类型、栈的层次、及程序中的出现位置(默认)
(4)catch语句块中定义的异常类型必须是try语句块中出现的异常,或是其父类对象才能捕获此异常
(5)try语句块后边有多个catch代码块,异常发生时,根据异常的类型依次与catch代码块中异常类型匹配,如果异常匹配,就执行该代码块,不再执行其它catch代码块;如果没有匹配代码块程序将被中断
(6)try语句块后边有多个catch代码块时,父类异常不能写在子类异常的前面
注意:catch中一定要有处理异常的代码,切勿只捕获不处理
3.finally代码块
(1)finally代码块中通常写入受保护代码。例如:清空结果集、关闭文件、断开数据库等操作
(2)无论try代码块是否出现异常都会执行finally代码块
(3)finally语句块不被完全执行的特例:
finally语句块发生异常
Java虚拟机退出程序——System.exit();
4.throws手动抛出异常
一般形式:throws new ***Exception (…)
七、自定义异常
1.必须继承Exception类,创建自定义的异常类
2.在方法需要抛出异常的位置生成异常对象,用throw抛出
3.在方法的声明部分用throws声明方法可能抛出的异常
应用场合:
(1)方法调用了一个抛出检查异常的方法
(2)程序运行时发生错误,利用throw抛出一个检查异常
4.方法重写中的异常处理:重写方法需要抛出与原方法所抛出异常类型一致(相同的类或子类)的异常或不抛出异常
八、必考题
1.写出五个你积累的异常
Exception
ArrayIndexOutOfBoundsException数组越界
NullPointerException
IOException
RuntimeException
FileNotFoundException等
2.final finally finalize的区别
(1)final可以修饰变量、方法和类,修饰的类没有子类,修饰的方法不能被重写,修饰的变量就是常量
(2)finally是异常中跟try配套的,无论try是否发生异常都会执行finally中的代码
(3)finalize在垃圾器执行的时候如果代码中有finalize方法,就会在本次回收对象的时候放过该对象,下次再回收