try { } catch{ } finally{ } 执行顺序总结

publicclass TestTry {  

publicstaticvoid main(String[] args) {  

       TestTry t = new TestTry();  

       System.out.println(t.getString() + " ---- return执行结束!");  

   }  

public String getString() {  

       String testString = "abc";  

try {  

           System.out.println("执行try!");  

//           int a = 9 / 0;

return testString;  

       } catch (Exception e) {  

           System.out.println("执行catch!");  

return testString;  

       } finally {  

           System.out.println("执行finally!");  

       }  

   }  

}  


执行结果:

[1]执行try!
[2]执行finally!
[3]abc ---- return执行结束!


-------------------------------------------------------------------
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。

在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果,

因此,即使finally中对变量a进行了改变,但是不会影响返回结果。验证实例:

publicclass Test11 {  

publicstaticvoid main(String[] args) {  

int b = f();  

       System.out.println(b);  

   }  

privatestaticint f() {  

int a = 10;  

try {  

           a += 10;  

           System.out.println("try");  

//          int e = 3 / 0;

           a += 10;  

return a;  

       } catch (Exception ex) {  

           System.out.println("catch");  

return a;  

       } finally {  

           System.out.println("finally");  

           a += 100;  

      }  

   }  

}  


执行结果:

[1]  try
[2]  finally
[3]  30



结论:

1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的;
4.finally块中不主张包含return语句,如果加了return在finally块中,将返回这个值。

总结:finally在return前执行,在finally的操作,不会改变已经确定的return的值。


你可能感兴趣的:(try,{,},},},catch{,finally{,执行顺序总结)