java异常处理中的返回值

1.try-catch中的返回值

java代码中,有各种各样的try-catch代码用来捕获各种异常。那么在try-catch代码中,返回值是如何处理的呢?先看看下面的代码

    public static int test_finally() {
        int x;
        try {
            x = 1;
            //int y = 1/0; 注释1
            //String raw = "a"; 注释2
            //raw.substring(3); 注释2
            return x;
        } catch(ArithmeticException ex) {
            x = 2;
            return x;
        } finally {
            x = 3;
        }
    }

2.执行结果

1.如果代码正常执行,返回结果为1。
2.如果加入注释1的代码,返回结果为2。
3.如果加入注释2的代码,直接抛出异常无返回结果。

3.结果分析

第一种情况很好理解,代码走正常逻辑直接返回结果。
第三种情况也比较好理解,直接抛异常。
第二种情况有的同学可能会问,明明finally中给x=3,为什么会返回2?

对于一个java方法来说,退出的方式有两种:
1. 遇到一个返回的指令(return语句)
2. 遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。
所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。
如果我们把代码放在intellij里面,x = 3这一行会提示:
The value 3 assigned to 'x' is never used less

如果我们在intellij里面debug,当代码运行到x = 3这一行时,堆栈信息如下:

java异常处理中的返回值_第1张图片

当程序执行到catch代码快中的return x 那一行时,首先是将x的一个副本保存在了方法栈帧的本地变量表中,执行return之前必须执行finally中的操作:x=3,此时将x设置为了3。但是return时是将本地变量表中保存的x的那个副本拿出来放到栈顶返回,所以出ArithmeticException异常或其子类异常时,返回值是2。

你可能感兴趣的:(java)