- 不管有没有出现异常,finally块中的代码都会执行;
- 当try和catch中有return时,finally仍然会执行;
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
package com.fy;
public class T3 {
public static void main(String[] args) {
//1. 情况1:程序按顺序执行
try {
}catch (){
}finally{
}
return;
//2. 情况2:
/**
* 1. 程序在执行try块中return之前(包括return语句中的表达式运算)代码
* 2. 再执行finally块,最后执行try中return;
* 3. finally块之后的语句return,因为程序在try中已经return,所以不再执行
*/
try {
return;
}catch (){
}finally{
}
return;
//3. 情况3:
/**
* 1. 程序先执行try,如果遇到异常则执行catch块;
* 2. 有异常时,则执行catch中return之前(包括return语句中的表达式运算)代码;
* 3. 再执行finally语句中的全部代码,最后执行catch块中return
* 4. finally之后的代码不再执行
*
* 无异常时:执行完try再finally,最后finally
*
*/
try {
}catch (){
return;}finally {
}
return;
//情况4:
/**
* 1. 程序执行try块中的return之前代码;
* 2. 再执行finally块,因为finally中有return,所以提前退出
*/
try {
return; }catch (){
} finally{
return;}
//情况5:
/**
* 1. 程序执行catch块之前(包括return运距中的表达式运算)代码;
* 2. 再执行finally块,因为finally块中有return所以提前退出
*/
try {
} catch (){
return;}finally {
return;}
//情况6:
/**
* 1. 程序执行try块中return之前代码;
*
* 2. 有异常:
* 执行catch中return之前代码;再执行finally块,
* 因为finally块中有return所以提前退出
*
* 3. 无异常:
* 则再执行finally块,因为finally块中有return所以提前退出
*/
try {
return;}catch (){
return;}finally {
return;}
/**
* 最终结论:
* 1. 如果finally存在,任何执行try或者catch中的return语句之前,
* 都会先执行finally语句;
*
* 2. 如果finally中有return语句,那么程序就return了,
* 所以finally中return是一定被return,
* 编译器把finally中的return实现为一个warning。
*
*/
}
}