前言
我们知道函数执行到return语句时,函数就会返回。那现在提出两个问题供新手朋友们思考。return后finally中的代码还会执行吗?finally中也可以有return吗?
案例一
/**
* return和finally执行顺序
*/
public class ReturnDemo {
/**
* 测试代码
*/
public static void main(String[] args) {
System.out.println(doSomething());
}
public static String doSomething() {
try {
return "函数返回";
} finally {
System.out.println("finally代码块中代码执行");
}
}
}
运行结果:
从运行结果可以看出,在函数返回前, finally代码块会执行。看到这个输出,可能有小伙伴会问了,到底是return先执行还是finally代码块先执行,那我们继续看下面的案例。
案例二
/**
* return和finally执行顺序
*/
public class ReturnDemo {
/**
* 测试代码
*/
public static void main(String[] args) {
System.out.println(doSomething());
}
public static String doSomething() {
try {
return executeReturn();
} finally {
System.out.println("finally代码块中代码执行");
}
}
public static String executeReturn(){
System.out.println("return执行");
return "函数返回";
}
}
运行结果:
从运行结果可以看出,先执行return,再执行finally代码块,最后把结果返回给调用者。
案例三
/**
* return和finally执行顺序
*/
public class ReturnDemo {
/**
* 测试代码
*/
public static void main(String[] args) {
System.out.println(doSomething());
}
public static String doSomething() {
try {
return "函数正常返回";
} finally {
System.out.println("finally代码块中代码执行");
return "函数finally中返回";
}
}
}
运行结果:
从运行结果可以看出,虽然代码执行到了return语句,但由于finally中又出现了一个return,它会把之前的return给覆盖。但我们日常开发中不建议这么写,finally尽量来做资源的回收,比如:关闭连接、释放锁等,尽量不要把普通的业务逻辑写在catch和finally语句中。
总结
1.执行顺序是先执行return,再执行finally代码块,最后把结果返回给调用者。
2.finally代码块中的return会把之前的return覆盖。