首页 > 技术文章 > 【Java】finally执行顺序及对return返回值的影响

Zeiion 2021-05-08 00:14 原文

finally执行顺序

1.try中有return

try中有return,finally依旧可以执行,且先执行finally语句再return

try {
   return 1;
} finally {
   System.out.println("finally");
}
2.catch中有return

catch中有return,finally依旧可以执行,且先执行finally语句再return
需要注意的是,return后的语句会先执行,然后再执行finally中的语句

try {
   //制造异常
   int i = 0 / 0;
   return 0;
} catch (Exception e) {
   return 1;
} finally {
   System.out.println("finally");
}
3.finally中有return

finally中如果有return,就会直接返回,会忽略try/catch中的return

try {
   //制造异常
   int i = 0 / 0;
   return 0;
} catch (Exception e) {
   return 1;
} finally {
   System.out.println("finally");
   return 2;
}

总结:

程序在try/catch中碰到return时,知道自己命不久矣,就会先跳到finally,然后就返回。

finally是否会影响返回值

finally先执行再return,那么究竟finally会不会影响return的返回值呢?

1.finally中修改返回的基本数据类型变量 –> 不影响
//catch中的return结果同样
public static int a() {
    int i = 0;
    try {
        i = 99;
        return i;
    } finally {
        i++;
        //i = 3;
    }
}

运行结果为 99

2.finally中修改返回的String –> 不影响
//catch中的return结果同样
public static String a() {
    String s = "0";
    try {
        s = "1";
        return s;
    } finally {
        s += "2";
        //s = "12";
    }
}

运行结果为 1

3.finally中修改返回的引用类型变量 –> 影响
public static StringBuilder a() {
    StringBuilder s = new StringBuilder("0");
    try {
        s.append("123");
        return s;
    } finally {
        s.append("456");
    }
}

运行结果为 0123456

推荐阅读