黑马论坛--异常中catch代码块中有return时finally是怎么执行的讨论

来源:互联网 发布:java项目描述怎么写 编辑:程序博客网 时间:2024/05/21 10:47

在坛子里发现有人讨论在异常处理的catch中有return同时又用finally对返回值进行操作时是怎么执行的有了一下代码:


<span style="font-family: Arial, Helvetica, sans-serif;">/*</span>
 * 需求:如果在finally执行的前面有return语句,则finally里的代码还会执行吗,会,在return的前还是后?* 答:会,前。准确的讲是在 return 的中间*/public class FinallyDemo {        public static void main(String[] args) {                // 调用方法,输出结果                System.out.println(getInt()); // 结果 a = 30        }        public static int/*String*/ getInt() {                // 定义数组                int[] arr = { 11, 22, 33, 44, 55 };                int a = 10;//String a="abc";                // 异常处理                try {                        System.out.println(arr[5]);                        a = 20;//a="a";                } catch (ArrayIndexOutOfBoundsException e) {                        a = 30;                        return a;                        // 当执行到 return a 时,会形成 return 30 的返回路径。                        // 但此时发现还有下面有 finally ,所以就跳转到执行 finally 语句了, a = 40。                        // 执行完 finally 语句后又回到了原来的返回路径,虽然a变成了40,但是输出的还是原来的return 30。                } finally {                        a = 40;//a="b"                }                return a;        }}


上面我又用了String类型的引用类型来替换发现还是输出了catch中的a
所以得出了一下结论:
当异常时读到return时将返回的值复制了一份,然后执行finally最后跳转回来再执行的,我又将这里的a换成String类型来测试引用类型是否会改变,结果还是一样





<span style="font-family: Arial, Helvetica, sans-serif;">/*</span>
 * 需求:如果在finnally执行的前面有return语句,则finally里的代码还会执行吗,会,在return的前还是后?* 答:会,前。准确的讲是在 return 的中间*/public class FinallyDemo {        public static void main(String[] args) {                // 调用方法,输出结果                System.out.println(getInt()); // 结果 a = 30        }        public static int/*String*/ getInt() {                // 定义数组                int[] arr = { 11, 22, 33, 44, 55 };                int a = 10;//String a="abc";                // 异常处理                try {                        System.out.println(arr[5]);                        a = 20;//a="a";                } catch (ArrayIndexOutOfBoundsException e) {                        a = 30;                        return a;                        // 当执行到 return a 时,会形成 return 30 的返回路径。                        // 但此时发现还有下面有 finally ,所以就跳转到执行 finally 语句了, a = 40。                        // 执行完 finally 语句后又回到了原来的返回路径,虽然a变成了40,但是输出的还是原来的return 30。                } finally {                        a = 40;//a="b"                }                return a;        }}

0 0
原创粉丝点击