异常的体系结构
⾃定义异常通常会继承⾃Exception或者RuntimeException
继承⾃Exception的异常默认是受查异常 (编译时异常)
继承⾃RuntimeException的异常默认是⾮受查异常(运行时异常)
异常的声明-throws
throws 关键字⽤于在⽅法声明中列出该⽅法可能抛出的异常,它告诉调⽤者这个⽅法可能会抛出某 些异常,调⽤者需要处理这些异常。使⽤ throws 实际上是将异常的处理责任转移给了调⽤该⽅法 的代码
语法格式: 修饰符 返回值类型 ⽅法名(参数列表) throws 异常类型1,异常类型2...{ }finally
在写程序时,有些特定的代码,不论程序是否发⽣异常,都需要执⾏,⽐如程序中打开的资源:⽹络 连接、数据库连接、IO流等,在程序正常或者异常退出时,必须要对资源进进⾏回收。另外,因为异 常会引发程序的跳转,可能导致有些语句执⾏不到,finally就是⽤来解决这个问题的。
语法格式: try{ // 将可能出现异常的代码放在这⾥ }catch(要捕获的异常类型 e){ // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型⼀致 时,或者是try中抛出异常的基类时,就会被捕获到 // 对异常就可以正常处理,处理完成后,跳出 try-catch 结构,继续执⾏后序代码 }[catch(异常类型 e){ // 对异常进⾏处理 }finally{ // 此处代码⼀定会被执⾏到 }finally中的代码⼀定会执⾏的,⼀般在finally中进⾏⼀些资源清理的扫尾⼯作。
异常处理流程总结
1. 程序先执⾏try中的代码
2.如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配.
3.如果找到匹配的异常类型,就会执⾏catch中的代码
4.如果没有找到匹配的异常类型,就会将异常向上传递到上层调⽤者.
5.⽆论是否找到匹配的异常类型,finally中的代码都会被执⾏到(在该⽅法结束之前执⾏).
6.如果上层调⽤者也没有处理的了异常,就继续向上传递.
7.⼀直到main⽅法也没有合适的代码处理异常,就会交给JVM来进⾏处理,此时程序就会异常终⽌.