zoukankan      html  css  js  c++  java
  • J2SE基础夯实系列之finally中return语句

       最终结论:try,catch,还有finally语句中,finally中的return会覆盖try或者catch中的return!!    

    如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。


    以前面试有人问过我这个问题,今天在网上看到相关的文章,因为自己也不甚理解所以自我测试,也对网上一些测试结果发表一些看法!
    情况1:try{}       catch(){}        finally{} return;

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.          }catch(Exception e){   
    12.              System.out.println("error :" + e);
    13.          }finally{   
    14.               if(b>25){   
    15.                   System.out.println("b>25 :"+b);   
    16.               }   
    17.               System.out.println("finally");   
    18.          }
    19.          
    20.          return 101;             //---4
    21.     }
    22. }

    显然程序按顺序执行,最后return 101退出
    结果:

    1. yes
    2. b>25 :111
    3. finally
    4. 101

    情况2:try{ return; } catch(){} finally{} return;

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.              return b;            //---1
    12.          }catch(Exception e){   
    13.              System.out.println("error :" + e);
    14.          }finally{   
    15.               if(b>25){   
    16.                   System.out.println("b>25 :"+b);   
    17.               }   
    18.               System.out.println("finally");   
    19.          }
    20.          
    21.          return 101;             //---4
    22.     }
    23. }

    程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;
    finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。

    结果:

    1. yes
    2. b>25 :111
    3. finally
    4. 111

    情况3:try{ } catch(){ return;} finally{} return;

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.          }catch(Exception e){   
    12.              System.out.println("error :" + e);
    13.              return b;            //---2
    14.          }finally{   
    15.               if(b>25){   
    16.                   System.out.println("b>25 :"+b);   
    17.               }   
    18.               System.out.println("finally");   
    19.          }
    20.          
    21.          return 101;             //---4
    22.     }
    23. }

    程序先执行try,如果遇到异常执行catch块,
        有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行
    catch块中return. finally之后也就是4处的代码不再执行。
        无异常:执行完try再finally再return.
    结果:本次为无异常结果(当然本示例没有设计异常)

    1. yes
    2. b>25 :111
    3. finally
    4. 101

    情况4:try{ return; } catch(){} finally{return;}

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.              return b;            //---1
    12.          }catch(Exception e){   
    13.              System.out.println("error :" + e);
    14.          }finally{   
    15.               if(b>25){   
    16.                   System.out.println("b>25 :"+b);   
    17.               }   
    18.               System.out.println("finally");   
    19.               return 100;        //---3
    20.          }
    21.          
    22.     }
    23. }

    程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
    结果:

    1. yes
    2. b>25 :111
    3. finally
    4. 100


    情况5:try{} catch(){return;} finally{return;}

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.          }catch(Exception e){   
    12.              System.out.println("error :" + e);
    13.              return b;            //---2
    14.          }finally{   
    15.               if(b>25){   
    16.                   System.out.println("b>25 :"+b);   
    17.               }   
    18.               System.out.println("finally");   
    19.               return 100;        //---3
    20.          }
    21.          
    22.     }
    23. }

    程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
    结果:

    1. yes
    2. b>25 :111
    3. finally
    4. 100


    情况6:try{ return;} catch(){return;} finally{return;}

    1. package com.lwf.eus.servlet;

    2. public class Test{  
    3.     public static void main(String[] args){
    4.          System.out.print(tt());   
    5.     }   
    6.     public static int tt(){   
    7.          int b = 23;   
    8.          try{   
    9.              System.out.println("yes");
    10.              b += 88;
    11.              return b;            //---1
    12.          }catch(Exception e){   
    13.              System.out.println("error :" + e);
    14.              return b;            //---2
    15.          }finally{   
    16.               if(b>25){   
    17.                   System.out.println("b>25 :"+b);   
    18.               }   
    19.               System.out.println("finally");   
    20.               return 100;        //---3
    21.          }
    22.          
    23.     }
    24. }

    程序执行try块中return之前(包括return语句中的表达式运算)代码;
       有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
       无异常:则再执行finally块,因为finally块中有return所以提前退出
    无异常结果:

    1. yes
    2. b>25 :111
    3. finally
    4. 100


    以下情况
    情况1:try{} catch(){} finally{} return;
    情况2:try{ return; } catch(){} finally{} return;
    情况3:try{} catch(){ return;} finally{} return;
    情况4:try{ return; } catch(){} finally{return;} 
    情况5:try{} catch(){return;} finally{return;} 
    情况6:try{ return;} catch(){return;} finally{return;} 

    以上几种情况说明:
    一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
    二、
    只要finally块中有return则try或catch中的return不再执行

    以下几种情况在finally块的后面是不能出现return的。
    情况:try{} catch(){} finally{ return;} return;
    情况:try{ return; } catch(){} finally{return;} return;
    情况:try{} catch(){return;} finally{return;} return;
    情况:try{ return; } catch(){return;} finally{} return;
    情况:try{ return; } catch(){return;} finally{return;} return;

    上 面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的 try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。

    还有一种情况:


    最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。


  • 相关阅读:
    python-excel操作
    python-处理文件
    python-pandas应用总结
    python比较数组
    vue学习一(指令1.v-text,v-html,插值表达式{{msg}})
    博客园背景图页面定制css
    SpringBoot的yml文件报org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here in 'reader', line 11, column 16:
    python初学习一
    C#多线程
    API与WebApi
  • 原文地址:https://www.cnblogs.com/allenzhaox/p/3201861.html
Copyright © 2011-2022 走看看