细琢磨,try catch finally 执行顺序与返回值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J080624/article/details/84671017

try catch finally 常见格式如下:

try{

//应用代码

}catch(Exception e){

//异常捕捉处理

}finally{

//资源释放、流关闭等等
}

通常执行顺序:

  • try有异常时,try-catcy-finally
  • try无异常时,try-finally

那么如果有返回值呢?try catch finally 每个部分均有return语句呢?finally中抛出异常呢?下面逐个实践分析。

① 不抛异常,方法末尾处return

测试代码如下:

public class TestTryCatch {

    public static void main(String[] args){
        int test1 = test1();
        System.out.println("main block : "+test1);
    }

    public static int test1(){
        int i = 1;
        try{
            i++;
            System.out.println("try block, i = "+i);
        }catch(Exception e){
            i++;
            System.out.println("catch block i = "+i);
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
        return i;
    }
}

测试结果如下:

try block, i = 2
finally block i = 10
main block : 10

每个部分,基本类型变量 i 都被修改值,最后返回值取finally中i的最终值。


② 在try catch 部分放return语句

测试代码如下:

public static int test2(){
        int i = 1;
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
    }

测试结果如下:

try block, i = 2
finally block i = 10
main block : 2

注意,这里main中获取test2的返回值为 2 不是 10!

分析如下:

代码顺序执行从try到finally,由于finally是无论如何都会执行的,所以try里的语句并不会直接返回。

在try语句的return块中,return返回的引用变量并不是try语句外定义的引用变量i,而是系统重新定义了一个局部引用i’,这个引用指向了引用i对应的值,也就是2。

即使在finally语句中把引用i指向了值10,因为return返回的引用已经不是i,而是i',所以引用i的值和try语句中的返回值无关了。

查看test2编译后源码如下:

  public static int test2() {
        byte i = 1;

        int var2;
        try {
            int i;
            try {
                i = i + 1;
                System.out.println("try block, i = " + i);
                int var1 = i;
                return var1;
            } catch (Exception var6) {
                i = i + 1;
                System.out.println("catch block i = " + i);
                var2 = i;
            }
        } finally {
            i = 10;
            System.out.println("finally block i = " + i);
        }

        return var2;
    }

可以看到try处返回的是var1 , 方法最后返回的是var2 !

猜你喜欢

转载自blog.csdn.net/J080624/article/details/84671017