一:概述:
try-catch-finally是java异常处理的常用方式,其中对于finally的执行以及一些变量的变换是我们比较容易忽略的地方。
二:try-catch-finally的实现:
try{
… //可能产生异常的代码
}
catch( ExceptionName1 e ){
… //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e ){
… //当产生ExceptionName2型异常时的处置措施
}
[ finally{
… //无论是否发生异常都会执行
try
捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现
异常的代码放在try语句块中。
catch (Exceptiontype e)
在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随
一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
***finally***
捕获异常的最后一步是通过finally语句为异常处理提供一个
统一的出口,使得在控制流转到程序的其它部分以前,能够
对程序的状态作统一的管理。
不论在try代码块中是否发生了异常事件,catch语句是否执
行,catch语句是否有异常,catch语句中是否有return,
finally块中的语句都会被执行。
finally语句和catch语句是任选的
例子:
从这里可以看出发生了异常但是,finally后的语句仍然是执行了。
三:如何不让finally 执行:
可以在catch捕获异常时加入 System.exit(0):
finally语句没有执行。
四:finally执行时相关变量的变化:
1:第一种(也就是基本数据类型)
第二种:
可以看到第一种情况返回的值并没有改变,而第二种改变了。
画图解释一下:
第一种:
在执行try时,将a备份出来,也就是备份的等号右边的值,返回的是20,但是当将a改为20时,对于此时返回的值没有什么改变。因为一开始返回的不是a,而是a的值10,所以最后a值改变了,但是返回值没有变。
第二种:
第二种是引用数据类型:
try中返回的是Person p 等号右边的是p 的地址,返回的也是person p 的地址,最后finally修改的时候,person p的地址并没有改变,找到person p 的地址,再对地址里面的变量进行修改。
举一个例子:
一个聚宝盆(地址)现在产生了50两黄金,你拿走了50两黄金,但是聚宝盆一直生产,现在里面有100两黄金,但是你自己只有50两,聚宝盆里面的和你没有关系(第一种情况)。如果你抱走的是整个聚宝盆,聚宝盆里面有多少黄金就是你所拥有的黄金。