在进行异常捕获时,因为异常会引发程序跳转,导致有些语句执行不到,无法满足这个需求,因此Java在捕获异常时提供了解决方案。
捕获是的结构:try catch finally
finally 代码块中的代码是一定会执行的(无论以前的代码是怎样的:已经在前面的代码中有return finally中的代码还是会执行)
注意在强制性退出的情况下finally 中的代码也不会执行(exit(0))
————————————————————————————————————————————————————————————————————————————————————————————————————————
finally 的使用情景
举例:向数据库里添加数据;
添加数据:1.连接数据库
2.添加数据// 添加数据时发生了异常。throw new SQLException(); 程序跳转,就执行不了断开连接
//但是断开操作是必须要执行的,不执行断开操作,连接资源就会被浪费(对应的接口会一直处理这个异常)
3.断开连接
抽象的代码格式
1.连接数据库
try{
//添加数据//考虑到异常的发生
}
catch( ){
//解决数据库的问题
//同时将问题告诉调用者
}
finally{
//3.断开连接
}
总结:finally 到底什么时候用?
只要程序中使用到了具体的资源(数据库,IO 资源 ,网络连接socket 等)需要释放,都必须定义在finally 中。在定义程序时,无论问题发生与否,制定的语句都要执行,此时就要定义在finally 代码块中
————————————————————————————————————————————————————————————————————————————————————————————————————————
一段有趣的代码:
class Test{
int show(int num){
try {
if (num < 0) {
throw new RuntimeException("参数错误!!");
}
return 4;
}
catch(RuntimeException Ex) {
System.out.println(Ex.toString());
return 400;
}
finally{
return 100;
}
}
}
1.num为4输出——4
2.num为-4输出——100——没有finally 输出为400
当finally 中有结束时,最终的结束状态由finally 中的语句决定
可以结束函数的语句:return /异常
直接退出:exit(0); finally 也是拯救不了的
————————————————————————————————————————————————————————————————————————————————————————————————————————
try catch finally 的组合方式(必要掌握)
1.try catch:对代码进行异常检测,并将异常传递给catch 进行处理——对 异常进行捕获
try{
throw new Exception();
}catch( Exception ex){
//给出处理方式
}
2.try finally:对代码进行异常检测,检测到后没有catch 所以一样会需要声明给JVM 认为是没有捕获处理的
try{
throw new Exception();
}finally{
//一定要执行的语句
}
//检测到异常后但是却想不到解决异常的方法(是为没有进行捕获处理,还需要声明throws Exception)但是有一定要执行的当代码语句
3.完整的使用:try catch finally:检测得到异常,并传递给catch 处理,并定义资源释放
4.try catch1 catch2 ....:catch 的个数取决于try 中向catch 传了多少个异常