下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料。
测试程序如下:
package com.andy.code;
public class TestFinally {
public static int gett(){
int t = 1;
try{
System.out.println("before throw");
throw new Exception();
// System.out.println("before return");
//return ++t;
}catch(Exception e){
t++;
return ++t;
}finally{
t+=100;
System.out.println("finaly");
// return t;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(gett());
}
}
异常处理的流程:先执行try块里的代码,如果抛出了异常,则转到相应的catch块里执行,在catchreturn之前执行finally块,反之,如果没有异常,则在try块return之前执行finally语句。
实验出来的结果分两种情况:
1.try 或catch块里含有return语句而finally没有return语句:
这种情况程序执行到try或catch块中的return语句时,将要return的结果计算出来保存等着方法结束时返回,然后接着执行finally里的代码,即使里面有改变了某些变量的值,也不会影响最后的返回值。
2.try 或catch 与finally里同时有return语句,同样在try或catch的return之前保存结果等待返回,接着执行finally代码,但是finally的return语句将会执行,就是说它屏蔽掉了try catch里的return,最后返回的值是finally return的结果。