zoukankan      html  css  js  c++  java
  • try--catch--finally中return返回值执行的顺序

    1、try块中没有抛出异常,try、catch和finally块中都有return语句
     
     1 public static int NoException(){
     2          int i=10;
     3          try{
     4            System.out.println("i in try block is:"+i);
     5            return --i;
     6          }
     7          catch(Exception e){
     8            --i;
     9            System.out.println("i in catch - form try block is:"+i);
    10            return --i;
    11          }
    12          finally{     
    13            System.out.println("i in finally - from try or catch block is:"+i);
    14            return --i;
    15          }  
    16 }
    运行代码:
    1 public static void main(String[] args) {
    2         System.out.println("=============NoException==================");
    3         System.out.println(NoException());
    4         System.out.println("===============================");   
    5 }
    运行结果: 
    1 =============NoException==================
    2 i in try block is:10
    3 i in finally - from try or catch block is:9
    4 8
    5 ===============================
    执行顺序:
       执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值。
    结论:try-catch-finally都有return语句时,没有异常时,返回值是finally中的return返回的。
     
    2.try块中没有抛出异常,仅try和catch中有return语句
     1 public static int NoException1(){
     2             int i=10;
     3             try{
     4                 System.out.println("i in try block is:"+i);
     5                 return --i;
     6             }
     7             catch(Exception e){
     8                 --i;
     9                 System.out.println("i in catch - form try block is:"+i);
    10                 return --i;
    11             }
    12             finally{           
    13                 System.out.println("i in finally - from try or catch block is:"+i);
    14                 --i;
    15                 System.out.println("i in finally block is:"+i);
    16                 //return --i;
    17             }
    18 }
    运行结果:
    1 =============NoException1==================
    2 i in try block is:10
    3 i in finally - from try or catch block is:9
    4 i in finally block is:8
    5 9
    6 ===============================
    执行顺序:
       try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值。
    结论:try-catch都有return语句时,没有异常时,返回值是try中的return返回的。
     
    3.try块中抛出异常,try、catch和finally中都有return语句
     1 public static int WithException(){
     2             int i=10;
     3             try{
     4                 System.out.println("i in try block is:"+i);
     5                 i = i/0;
     6                 return --i;
     7             }
     8             catch(Exception e){
     9                 System.out.println("i in catch - form try block is:"+i);
    10                 --i;
    11                 System.out.println("i in catch block is:"+i);
    12                 return --i;
    13             }
    14             finally{           
    15                 System.out.println("i in finally - from try or catch block is--"+i);
    16                 --i;
    17                 System.out.println("i in finally block is--"+i);
    18                 return --i;
    19             }
    20 }
    执行结果:
    1 =============WithException==================
    2 i in try block is:10
    3 i in catch - form try block is:10
    4 i in catch block is:9
    5 i in finally - from try or catch block is--8
    6 i in finally block is--7
    7 6
    8 ===============================
    执行顺序:
       抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6。
    结论:
       try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。
     
    4.try块中抛出异常,try和catch中都有return语句
     1 public static int WithException1(){
     2             int i=10;
     3             try{
     4                 System.out.println("i in try block is:"+i);
     5                 i=i/0;
     6                 return --i;
     7             }catch(Exception e){
     8                 System.out.println("i in catch - form try block is:"+i);           
     9                 return --i;
    10             }finally{
    11                                                                                                                                                                       
    12                 System.out.println("i in finally - from try or catch block is:"+i);
    13                 --i;
    14                 System.out.println("i in finally block is:"+i);
    15                 //return i;
    16             }
    17 }
    执行结果:
    1 =============WithException1==================
    2 i in try block is:10
    3 i in catch - form try block is:10
    4 i in finally - from try or catch block is:9
    5 i in finally block is:8
    6 9
    7 ===============================
    执行顺序:
       抛出异常后,执行catch块,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值。
    结论:
       返回的catch中return值。
     
    5.try、catch中都出现异常,在finally中有返回
     1 public static int WithException2(){
     2             int i=10;
     3             try{
     4                 System.out.println("i in try block is:"+i);
     5                 i=i/0;
     6                 return --i;
     7             }
     8             catch(Exception e){
     9                 System.out.println("i in catch - form try block is:"+i);
    10                 int j = i/0;
    11                 return --i;
    12             }
    13             finally{
    14                                                                                        
    15                 System.out.println("i in finally - from try or catch block is:"+i);
    16                 --i;
    17                 --i;
    18                 System.out.println("i in finally block is:"+i);
    19                 return --i;
    20 }
    执行结果:
    1 =============WithException2==================
    2 i in try block is:10
    3 i in catch - form try block is:10
    4 i in finally - from try or catch block is:10
    5 i in finally block is:8
    6 7
    7 ===============================
    执行顺序:   
       try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常。
    结论:
       返回finally中return值。
     
    6、只在函数最后出现return语句
     1 public static int WithException3(){
     2             int i=10;
     3             try{
     4                 System.out.println("i in try block is:"+i);
     5                 i=i/0;
     6                 //return --i;
     7             }
     8             catch(Exception e){
     9                 System.out.println("i in catch - form try block is:"+i);
    10                 //int j = i/0;
    11                 //return --i;
    12             }
    13             finally{
    14                                                                           
    15                 System.out.println("i in finally - from try or catch block is:"+i);
    16                 --i;
    17                 --i;
    18                 System.out.println("i in finally block is:"+i);
    19                 //return --i;
    20             }
    21             return --i;
    22 }
    执行结果:
     
    1 =============WithException3==================
    2 i in try block is:10
    3 i in catch - form try block is:10
    4 i in finally - from try or catch block is:10
    5 i in finally block is:8
    6 7
    7 ===============================
     
    总体结论:
    结论一:
       return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
    结论二:
       finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
       (1)return语句只在函数最后出现一次。
       (2)return语句仅在try和catch里面都出现。
       (3)return语句仅在try和函数的最后都出现。
       (4)return语句仅在catch和函数的最后都出现。
       注意,除此之外的其他做法都是不可行的,编译器会报错。
     
    转载自:http://qing0991.blog.51cto.com/1640542/1387200
  • 相关阅读:
    HMS Core携手AppGallery赋能越南游戏发行商
    如何在React Native项目中集成华为远程配置服务
    华为应用市场AGC研习社|如何提升投放转化,实现获量增长?
    教你用三种方式打造一款简单的网络播放器
    基于Cocos SDKHub接入华为HMS Game服务—接入华为应用升级服务
    手把手教您快速运行Unity华为游戏(GameService)
    做好复购预测,触达用户消费的核心痛点
    华为 HMS Core:以技术撬动生态的顽强生命力
    Cocos平台 | 快速集成AGC云函数服务
    DOM操作技术
  • 原文地址:https://www.cnblogs.com/zhangboy/p/7643583.html
Copyright © 2011-2022 走看看