一、无return下的执行顺序
无return情况下很好理解:
1.程序执行try中的内容,如果try能正常执行,不会抛出对应异常,那么try执行后,执行fially,而catch不会执行。
2.程序执行try中的内容,如果try中发生对应异常,那么就会立刻被catch捕获,执行catch中的语句,最后执行finally。而try发生异常后的语句不会执行。
注:这两种情况共性是进入try后,都要最后执行finally。那么有没有finally不执行的情况呢?目前我见到的主要有两种。
1.程序不执行try,例如在try前退出程序,既然try都不执行,那finally自然不会执行。
2.程序在运行到finally之前终止。例如exit函数。
具体测试过程如下(测试代码见文章末)
二、有return下执行顺序
1.return在try或catch中,finally中无return。
首先,程序应向前面所说的,没有异常就执行try,有异常就执行catch。而无论哪个,都是在执行到return前执行finally,最后执行return返回值,return最后返回,从此处退出此函数,这也符合我们的认识。但是注意,finally中任何改变变量值得操作均不会对return的返回值进行改变,也就是说程序在执行try到return,此时应该返回什么值最后就应该返回什么值,并不会因为在return前执行了finally而发生改变。这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时确认了返回值。再去执行finally,如果finally中没有返回值,就把之前保留的返回值保留。
如图,i+2后应该等于3,但实际上返回1.
2.finally中有return
前面的过程是与上述过程一样的,不过在执行finally到最后直接在finally中return退出,其他部分return自然都不再执行。
三、总结
1.正常情况下执行了try,如果不是执行了程序终止,那么是一定要执行finally。
2.这些情况共性特点是,finally都在程序return退出之前执行。但是finally不会改变try,catch后面要return的值。
3.finally中有return,那么就执行finally中的return退出函数。
public class test {
public static void main(String[] args) {
int q=t();
System.out.println(q);
}
public static int t() {
Scanner inScanner=new Scanner(System.in);
/* if(inScanner.nextInt()==0) return; */
int i=0;
try {
i= inScanner.nextInt();
inScanner.close();
System.out.println("try");
return i;
/*
* System.exit(0);
*/
} catch (Exception e) {
System.out.println("catch");
// TODO: handle exception
return i;
}
finally {
i=i+2;
System.out.println("finally");
return i;
}
}
}