Return、finally执行关系简述

除了函数出现system.exit(0)终止虚拟机,finally中的代码一定执行,return语句会等待finally的执行;如果是值传递,finally中改变的值对try或catch块中return返回的值无影响;如果是引用类型参数(地址传递或对象),finally中的值改变对return会产生影响。

如果是值类型,压栈的就是经过复制的参数值,如果是引用类型,那么进栈的只是一个引用,这也就是我们所熟悉的,传递值类型时,函数内修改参数值不会影响函数外,而引用类型的话则会影响。

下面就值传递而言,说明问题。变量拷贝问题。

提出问题:

对于初学者来说,接触异常类,老师通常会跟我们说异常处理分为try-catch、try-catch-finally、try-catch-n个catch-catch(Exception e)-[finally]等等结构,参考书中一般还会出现try-finally格式,对异常不做任何处理,直接执行。教科书上还会说finally{……}中的语句一定会执行。

细心的读者会发现return是退出语句,对后面代码短路,finally中代码一定会执行,这个不矛盾吗?Catch中都return了,还会执行finally?结果是finally中代码是会执行的,但是执行的结果相当于局部变量,是对之前变量的拷贝,改变的值不会对catch中return值产生影响。

finally_return实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace finallyReturn
{
class Program
{
static void Main(string[] args)
{
int num= Test_Finally_Return.Test();
Console.WriteLine("num={0}",num);
Console.ReadKey();
}
} class Test_Finally_Return
{
public static int Test()
{
int num =0;
try
{
num = 1;
throw new Exception("手动控制抛出异常"); //若将throw注释掉,通过try中return返回,即正常执行时会不会执行finally,答案是会执行,但函数返回-1
//return -1;
} catch (Exception e)
{
Console.WriteLine(e.Message);
return num; //输出是多少??思考??输出num=1;相信很多人会认为返回2,这里面相当于是变量copy,finally中的变量改变对return值无影响。
}
finally
{
num++;//若果执行,那么返回应该是多少????执行了,num=2 Console.WriteLine("我在Finally中num={0}",num); //return 5;//finall中不能包含return语句,否则会报错
}
}
}
}

实例结果解释:

1.没有异常时,走try语句的return,走finally语句,但finally中不影响num值,返回值为-1。

2.有异常时,不走try语句的return,走catch中的return,走finally语句,finally同样不改变catch中num值。返回值为1。

3.如果finally中有return语句,程序会出现语法错误。

结论:

在try或catch语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try或catch中先把要返回的结果存放到不同于i的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量i进行了改变,但是不会影响返回结果。

在我们知道了return语句并不全对下面的代码短路,改变了我们以往一直错误的观念。但在出现异常处理时finally中的语句执行的结果不一定会对变量产生影响,但真的一定会执行吗?答案是否定的,如果try或catch块里有System.exit(0) 终止当前正在运行的 Java 虚拟机。finally里面的代码是没有机会执行的,这里就不展开了。

更多细节、运行底层原理请参考博文:http://blog.csdn.net/turkeyzhou/article/details/6024550

finally return 执行关系 异常处理 c#的更多相关文章

  1. 异常 try catch finally return 执行关系 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. .NET 并行(多核)编程系列之五 Task执行和异常处理

    原文:.NET 并行(多核)编程系列之五 Task执行和异常处理 .NET 并行(多核)编程系列之五 Task执行和异常处理 前言:本篇主要讲述等待task执行完成. 本篇的议题如下: 1. 等待Ta ...

  3. finally return 执行顺序问题

    网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下fina ...

  4. Go ---- defer 和 return 执行的先后顺序

    Go 中 defer 和 return 执行的先后顺序 多个defer的执行顺序为“后进先出”: defer.return.返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入 ...

  5. JAVA小知识点-Finally和Return的执行关系

    如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题: public static Map<String ...

  6. 转:Java中finally和return的执行关系

    finally可以分两方面理解 1.执行时机问题.finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catche后面执行 2.返回值问题.可以认为try( ...

  7. Java中的try,catch(Exception e),finally及return执行顺序

    结论: ①就算之前return,finally也会执行 ②finally的计算结果不影响之前的return值 ③finally的return值一定是最后的返回结果,因此将return放入finally ...

  8. java try catch finally return执行

    public static int testBasic(){ int i = 1; try{ i++; System.out.println("try block, i = "+i ...

  9. JVM关键字try、catch、finally、return执行过程

    关键字:jvm try catch finally return.指令 finally相当于在所有方法返回之前执行一次 finally中含有return其中finally中return会覆盖try和c ...

随机推荐

  1. (七)Thymeleaf的 th:* 属性之—— th: ->设值& 遍历迭代& 条件判断

    3.4 属性值的设置 3.4.1 使用th:attr来设置属性的值 <form action="subscribe.html" th:attr="action=@{ ...

  2. 网上流传的长盛不衰的Steve Jobs(乔布斯) 14分钟“Stay Hungry, Stay Foolish”演讲视频

    http://timyang.net/misc/speech/附:网上流传的长盛不衰的Steve Jobs 14分钟“Stay Hungry, Stay Foolish”演讲视频 (原视频地址:htt ...

  3. java 实现新浪微博内容计数器 Java问题通用解决代码

    http://www.mr3g.net/?p=220 参考sina的js版本而来,费弄最多的时间就是java对ansii码的判断了,js直接就是isascii()函数就可以实现了,java还要想办法 ...

  4. MongoDB基本命令使用

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示 ...

  5. ASP.NET CORE RAZOR :将搜索添加到 Razor 页面应用

    https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/search 本文档中,将向索引页面添加搜索功能以实现按“流派”或 ...

  6. CentOS4.5下LVS方案

    环境描述:本文在配置LVS时使用三台linux,一台做Directorserver (192.168.0.25) ,两台做realserver(192.168.0.127 192.168.0.12,在 ...

  7. Python基础之初识递归

    初识递归 递归的定义: 在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归. 递归的最大深度--997 递归函数不受外力的阻止会一直执行下去,python为了杜绝此类现象,强制将递归层 ...

  8. hdu 1598 find the most comfortable road(并查集)

    题意:略 分析:多询问问题,利用并查集加速.类似于kruskal对MST的构建:枚举最小的边,逐渐将更大的边加入集合,当查询的点在同一个集合,那么当前最小值,就是所加的最后一条边与第一条只差. 注意: ...

  9. HTML5 2D平台游戏开发#6地图绘制

    此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ...

  10. 【LeetCode-面试算法经典-Java实现】【118-Pascal&#39;s Triangle(帕斯卡三角形)】

    [118-Pascal's Triangle(帕斯卡三角形(杨辉三角))] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given numRows, generate ...