一:概述:

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语句是任选的

例子:

java中的parseJson Java中的try- catch-finally异常处理_java异常处理


java中的parseJson Java中的try- catch-finally异常处理_java中的parseJson_02

从这里可以看出发生了异常但是,finally后的语句仍然是执行了。

三:如何不让finally 执行:

可以在catch捕获异常时加入 System.exit(0):

java中的parseJson Java中的try- catch-finally异常处理_java异常处理_03


java中的parseJson Java中的try- catch-finally异常处理_java_04

finally语句没有执行。

四:finally执行时相关变量的变化:

1:第一种(也就是基本数据类型)

java中的parseJson Java中的try- catch-finally异常处理_java_05


java中的parseJson Java中的try- catch-finally异常处理_控制流_06

第二种:

java中的parseJson Java中的try- catch-finally异常处理_java异常处理_07


java中的parseJson Java中的try- catch-finally异常处理_java_08

可以看到第一种情况返回的值并没有改变,而第二种改变了。

画图解释一下:

第一种:

java中的parseJson Java中的try- catch-finally异常处理_控制流_09


在执行try时,将a备份出来,也就是备份的等号右边的值,返回的是20,但是当将a改为20时,对于此时返回的值没有什么改变。因为一开始返回的不是a,而是a的值10,所以最后a值改变了,但是返回值没有变。

第二种:

java中的parseJson Java中的try- catch-finally异常处理_java_10

第二种是引用数据类型:

try中返回的是Person p 等号右边的是p 的地址,返回的也是person p 的地址,最后finally修改的时候,person p的地址并没有改变,找到person p 的地址,再对地址里面的变量进行修改。

举一个例子:

一个聚宝盆(地址)现在产生了50两黄金,你拿走了50两黄金,但是聚宝盆一直生产,现在里面有100两黄金,但是你自己只有50两,聚宝盆里面的和你没有关系(第一种情况)。如果你抱走的是整个聚宝盆,聚宝盆里面有多少黄金就是你所拥有的黄金。