try-catch-finally执行顺序及多return语句效果

来源:互联网 发布:mac apktool使用教程 编辑:程序博客网 时间:2024/06/06 17:26

文本内容

1 执行过程

2 return语句



1 执行过程



2 return语句


规则:根据执行过程,最后一个执行的return语句生效,其返回值在执行相应return语句时就被确定,后续修改无效。


public static int testFinally() {int a = 1;try {a = 2;return a;} catch (Exception ioe) {a = 3;return a;} finally {a = 4;return a;}}// 返回值:4


public static int testFinally() {int a = 1;try {a = 2;return a;} catch (Exception ioe) {a = 3;return a;} finally {a = 4;}}// 返回值:2

原因分析:

在try块中执行到return a,由于存在finally块,因此,返回动作暂停,并将此时应返回的值(2)压入栈;

执行finally块代码,将变量a赋值为4;

执行完finally块,恢复返回动作,从栈中弹出要返回的数据(2)并返回。



public static int testFinally() {int a = 1;try {a = 2;a = 1/0;  // 除数为零异常return a;} catch (Exception ioe) {a = 3;return a;} finally {a = 4;}}// 返回值:3


原因分析:

同上一例子相同,最后一次执行到的return语句发生在catch块,当时的返回值为3。



特殊情况:

若返回的内容是引用类型(地址),则在执行最后一次return语句的时候,仅仅是确定了返回的引用值(地址)。

因此,若在finally块中,修改该引用指向的对象,修改的内容是可以生效的。

若理解基本数据和引用在内存中存储形式的相关知识,就不难理解其中的原因,其最终返回值依然是遵循之前说的规则:

最后一个执行的return语句生效,其返回值在执行相应return语句时就被确定(只是,这里确定的是引用)。



原创粉丝点击