ITPub博客

首页 > 应用开发 > Java > Java try catch finally

Java try catch finally

原创 Java 作者:壹頁書 时间:2016-05-17 11:37:48 0 删除 编辑
参考:
https://www.ibm.com/developerworks/cn/java/j-lo-finally/
http://www.cnblogs.com/lanxuezaipiao/p/3440471.html



finally 语句块一定会执行吗?
有两个前提条件
1.try块已经得到执行
2.不能出现Error.比如关停了JVM

finally块执行的时机
try或者catch return的语句执行时候,但是在实际return之前,执行finally

如果try或者catch中有返回,finally块的定位
相当于在try或者catch中调用了一个函数.和普通函数调用中传值,传址那套.一样一样的.

如果finally中有return,会直接覆盖try或者catch中的return

开始举栗子:
1.finally语句在return语句执行之后return返回之前执行的。
  1. public class T {  
  2.     public static void main(String[] args) {  
  3.   
  4.         System.out.println(test1());  
  5.     }  
  6.   
  7.     public static int test1() {  
  8.         int b = 20;  
  9.   
  10.         try {  
  11.             System.out.println("try block");  
  12.   
  13.             return b += 80;  
  14.         } catch (Exception e) {  
  15.   
  16.             System.out.println("catch block");  
  17.         } finally {  
  18.   
  19.             System.out.println("finally block");  
  20.   
  21.             if (b > 25) {  
  22.                 System.out.println("b>25, b = " + b);  
  23.             }  
  24.         }  
  25.   
  26.         return b;  
  27.     }  
  28. }  

结果:
try block
finally block
b>25, b = 100
100

说明try块中的b+=80 已经执行完毕,才进入finally块.

2.finally块中的return语句会覆盖try块中的return返回。
  1. public class T {  
  2.     public static void main(String[] args) {  
  3.   
  4.         System.out.println(test2());  
  5.     }  
  6.   
  7.     public static int test2() {  
  8.         int b = 20;  
  9.   
  10.         try {  
  11.             System.out.println("try block");  
  12.   
  13.             return b += 80;  
  14.         } catch (Exception e) {  
  15.   
  16.             System.out.println("catch block");  
  17.         } finally {  
  18.   
  19.             System.out.println("finally block");  
  20.   
  21.             if (b > 25) {  
  22.                 System.out.println("b>25, b = " + b);  
  23.             }  
  24.   
  25.             return 200;  
  26.         }  
  27.   
  28.         // return b;  
  29.     }  
  30. }  

try block
finally block
b>25, b = 100
200

也就是说如果finally中有return语句,会覆盖原来try或者catch中的return语句.

3.如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。
就是原来传值,传址那一套...

所谓传值的..
  1. public class T {  
  2.     public static void main(String[] args) {  
  3.   
  4.         System.out.println(test3());  
  5.     }  
  6.   
  7.     public static int test3() {  
  8.         int b = 20;  
  9.   
  10.         try {  
  11.             System.out.println("try block");  
  12.             return b += 80;  
  13.         } catch (Exception e) {  
  14.   
  15.             System.out.println("catch block");  
  16.         } finally {  
  17.   
  18.             System.out.println("finally block");  
  19.   
  20.             if (b > 25) {  
  21.                 System.out.println("b>25, b = " + b);  
  22.             }  
  23.   
  24.             b = 150;  
  25.         }  
  26.   
  27.         //有异常才会执行如下返回  
  28.         return 2000;  
  29.     }  
  30. }  

结果:
try block
finally block
b>25, b = 100
100

传址的
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.   
  4. public class T {  
  5.     public static void main(String[] args) {  
  6.         System.out.println(getMap().get("KEY").toString());  
  7.     }  
  8.   
  9.     public static Map getMap() {  
  10.         Map map = new HashMap();  
  11.         map.put("KEY", "INIT");  
  12.   
  13.         try {  
  14.             map.put("KEY", "TRY");  
  15.             return map;  
  16.         } catch (Exception e) {  
  17.             map.put("KEY", "CATCH");  
  18.         } finally {  
  19.             map.put("KEY", "FINALLY");  
  20.             map = null;  
  21.         }  
  22.   
  23.         return map;  
  24.     }  
  25. }  


结果:
FINALLY

传值传址本身就是一个不严谨的说法.
刚才传值的情况,如果将int改为Integer

  1. public class T {  
  2.     public static void main(String[] args) {  
  3.         System.out.println(test3());  
  4.     }  
  5.   
  6.     public static Integer test3() {  
  7.         Integer b = new Integer(20);  
  8.           
  9.         try {  
  10.             System.out.println("try block");  
  11.   
  12.             return b += 80;  
  13.         } catch (Exception e) {  
  14.   
  15.             System.out.println("catch block");  
  16.         } finally {  
  17.   
  18.             System.out.println("finally block");  
  19.   
  20.             if (b > 25) {  
  21.                 System.out.println("b>25, b = " + b);  
  22.             }  
  23.   
  24.             b = new Integer(150);  
  25.         }  
  26.   
  27.         return 2000;  
  28.     }  
  29. }  
结果:
try block
finally block
b>25, b = 100
100

给我的感觉,finally和以下的代码差不多
所以除非通过 指针b,修改原来对象的实际内容.
否则,修改 指针b指向别的对象,或者将指针b设置为null.都不能影响原来函数的返回值.

  1. public class T {  
  2.     public static void main(String[] args) {  
  3.         System.out.println(test3());  
  4.     }  
  5.   
  6.     public static Integer test3() {  
  7.         Integer b = new Integer(20);  
  8.         System.out.println("try block");  
  9.         b += 80;  
  10.         funcFinally(b);  
  11.         return b;  
  12.     }  
  13.   
  14.     private static void funcFinally(Integer b) {  
  15.   
  16.         System.out.println("finally block");  
  17.   
  18.         if (b > 25) {  
  19.             System.out.println("b>25, b = " + b);  
  20.         }  
  21.   
  22.         b = new Integer(150);  
  23.     }  
  24. }  

4.try块里的return语句在异常的情况下不会被执行。

  1. public class T {  
  2.     public static void main(String[] args) {  
  3.   
  4.         System.out.println(test4());  
  5.     }  
  6.   
  7.     public static int test4() {  
  8.         int b = 20;  
  9.         try {  
  10.             System.out.println("try block");  
  11.             b = b / 0;  
  12.             System.out.println("墓志铭:我觉得还能再抢救一下");  
  13.             return b += 80;  
  14.         } catch (Exception e) {  
  15.             b += 15;  
  16.             System.out.println("catch block");  
  17.         } finally {  
  18.             System.out.println("finally block");  
  19.             if (b > 25) {  
  20.                 System.out.println("b>25, b = " + b);  
  21.             }  
  22.             b += 50;  
  23.         }  
  24.         return b;  
  25.     }  
  26. }  

由于代码11行发生异常,直接进入catch,finally处理.最终在24行返回.

注意这个时候,catch和finally块对b的修改,都可以反映在最终的结果中.

结果:
try block
catch block
finally block
b>25, b = 35
85

5.当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样。

  1. public class T {  
  2.     public static void main(String[] args) {  
  3.   
  4.         System.out.println(test5());  
  5.     }  
  6.   
  7.     public static int test5() {  
  8.         int b = 20;  
  9.         try {  
  10.             System.out.println("try block");  
  11.             b = b / 0;  
  12.             return b += 80;  
  13.         } catch (Exception e) {  
  14.             System.out.println("catch block");  
  15.             return b += 15;  
  16.         } finally {  
  17.             System.out.println("finally block");  
  18.             if (b > 25) {  
  19.                 System.out.println("b>25, b = " + b);  
  20.             }  
  21.             b += 50;  
  22.         }  
  23.         // return b;  
  24.     }  
  25. }  

结果:
try block
catch block
finally block
b>25, b = 35
35


程序媛的总结:
最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值
若finally里也有return语句则覆盖try或catch中的return语句直接返回。


我觉得吧...finally就别写return了.


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2101289/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: iotop和pidstat
下一篇: ELK尝试
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339948