zoukankan      html  css  js  c++  java
  • try{}catch{}finally{}中加入return后的执行顺序

     

    网上看到一些关于在try{}catch{}finally{}中加入return后的执行顺序的讨论,
    不衷一是,于是自己写了个例子测试,过程和结论如下。  

       在try{}catch{}finally{}程序中,无论是否发生异常且无论try或catch语句块中包含什么代码 ("System.exit();"除外),finally语句块中的代码都会被执行。但当try语句块中包含return语句时执行顺序有点不一样。

      场景一:   

    public class TestFinally ...{

        public static void main(String[] args) ...{
            System.out.print(returnValue());
        }
        
        public static int returnValue()...{
            int i = 0;                // L1
            try...{                
                i = 1;                // L2
                return i = i + 5;    // L3
            } finally ...{            
                i = 2;                // L4
            }
        }
    }
              returnValue()方法中的语句执行顺序为"L1, L2, L3, L4, L3",最后执行的是try语句块中的return语句,但returnValue()的返回值是6,看起来似乎finally语句块中对变量i的赋值未 起作用,但实际上Debug的话会发现执行完finally语句块后转到return语句时变量i的值是新值2,但为什么return的是6呢?个人分析 认为这是因为每一次执行L3时实际上不执行return,而是执行了"i = i + 5;"(这时i==6)并将i值存入某个临时变量 "xTemp = i; "(xTemp == 6),而后执行了finally中的 "i = 2;",最后执行try语句块中的return语句实际上"return xTemp;"。

      场景二:

    public class TestFinally ...{

        public static void main(String[] args) ...{
            System.out.print(returnValue());
        }
        
        public static int returnValue()...{
            int i = 0;                // L1
            try...{                
                i = 1;                // L2
                return i = i + 5;    // L3
            } finally ...{            
                i++;                  // L4
                return i;            // L5
            }
        }
    }

       此时returnValue()方法中的语句执行顺序为"L1, L2, L3, L4, L5",最后执行的是finally语句块中的return语句,返回值是7。即try语句块中的return语句中的"i = i + 5;"得到了执行,最后由finally语句块中的return语句返回,try语句块中的return的返回功能不起作用了。

    观点二:

    public class Ceshi  

     public static void main(String args[]) 
     { 
    try 

    int i=0; 
    if(i==0)throw new Exception(); 

    catch(Exception e) 

    return; 

    System.out.println("liuhaibin"); 


    ----------------------------------------------------------------------
    可以这样写。没什么问题。 
    就是捕获到了异常就退出, 

    比如转换字符串为整数,默认返回-1 

    public static int toInt(String str) 

       try 
      { 
       return Integer.parseInt(str); 
      } 
      catch(Exception e){return -1;} 


    --------------------------------------------------------
    没有,当捕获到了异常就退出了,有finally子句. 
    --------------------------------------------------------
    有finally子句也不会执行. 
    --------------------------------------------------------
    finally子句一定是要执行的,无论有没有异常 
    -------------------------------------------------------
    捕获了异常就退出,有finally语句的话finally语句一定会执行~~ 
    -------------------------------------------------------
    如果有finally的话一定会执行,并且在catch的return之前执行 
    -------------------------------------------------------
    楼上的正解 
    --------------------------------------------------------
    catch要捕获到了异常才退出 
    finally中的话肯定会执行的 
    --------------------------------------------------------
    抛出异常就退出执行finally,retrun没意义 
    --------------------------------------------------------
    public class Test { 
    public static void main(String[] args) { 
    try 
        { 
         int i=0; 
        if(i==0)throw new Exception(); 
    }catch(Exception e){ 
            return; 
     } 
    finally{ 
    System.out.println("finally"); 

       System.out.println("out"); 



    结果是 
    finally 
    -------------------------------------------------------
    finally部分是有无异常都会执行的 
    -------------------------------------------------------

    使用return的作用是返回即退出!即他后面的语句不执行!但是finally部分是有无异常都会执行的,exit()可以终止程序运行!finally部分一样也不会执行!

  • 相关阅读:
    arcgis api for js入门开发系列二十打印地图的那些事
    arcgis api 3.x for js 入门开发系列十九图层在线编辑
    arcgis api 3.x for js 入门开发系列十八风向流动图(附源码下载)
    influxDB 0.9 C# 读写类
    [InfluxDB] 安装与配置
    分布式,集群,冗余的理解
    CentOS 7.0系统安装配置图解教程
    InfluxDB学习之InfluxDB的基本操作| Linux大学
    InfluxDB v1.6.4 下载
    InfluxDB中文文档
  • 原文地址:https://www.cnblogs.com/SunDexu/p/2763535.html
Copyright © 2011-2022 走看看