今天看一个Java SSH的面试题,题目大概意思是:try、catch中存在return语句,还会执行finally块吗?如果执行,是return先执行还是finally先执行?如果有多个return语句,结果如何?

看了以后我还真犯嘀咕,做了软件开发这些年,还没认真思考过则个问题,于是赶紧写个测试测试代码如下:

 class Program
{
public static int a = ;
static void Main(string[] args)
{
var result = GetValue();
} public static int GetValue()
{
try
{
a = ;
throw new Exception();
}
catch (Exception ex)
{
a = ;
return a;
a = ;
}
finally
{
a = ;
}
}
}

为了探究个明白,使用ILSpy工具查看IL代码, GetValue()的IL代码如下:

 .method public hidebysig static
int32 GetValue () cil managed
{
// Method begins at RVA 0x2064
// Code size 42 (0x2a)
.maxstack 1
.locals init (
[] class [mscorlib]System.Exception ex,//定义Exception类型变量 ex
[] int32 CS$$0000 //定义int32类型变量 CS$1$000
) IL_0000: nop //No Operation 没有任何操作
.try
{
.try
{
IL_0001: nop
IL_0002: ldc.i4.2 //把int32 类型的数据2 推入计算堆栈上
IL_0003: stsfld int32 ConsoleApplication1.Program::a //用计算堆栈的值替换静态字段a的值
IL_0008: newobj instance void [mscorlib]System.Exception::.ctor() //实例化Exception对象,并将对象推入到计算堆栈上
IL_000d: throw //引发当前位于计算堆栈上的异常对象
} // end .try
catch [mscorlib]System.Exception
{
IL_000e: stloc.0 //从计算堆栈的顶部弹出当前值(Exception对象)并将其存储到索引 0 处的局部变量列表中
IL_000f: nop
IL_0010: ldc.i4.3 //把整数类型3推入计算堆栈上
IL_0011: stsfld int32 ConsoleApplication1.Program::a //用计算堆栈的值置换静态变量a的值
IL_0016: ldsfld int32 ConsoleApplication1.Program::a //将静态字段a的值推入计算堆栈上
IL_001b: stloc.1 //从计算堆栈的顶部弹出当前值,并将其存储到索引 1 处的局部变量列表中
IL_001c: leave.s IL_0027 //退出受保护的代码区域,无条件将控制转移到目标指令 [ leave.s 指令清空计算堆栈并确保执行周围适当的 finally 块。]
} // end handler
} // end .try
finally
{
IL_001e: nop
IL_001f: ldc.i4.5 //把整数5推入计算堆栈上
IL_0020: stsfld int32 ConsoleApplication1.Program::a //用计算对象韩的值置换静态变量a的值
IL_0025: nop
IL_0026: endfinally //将控制从异常块的 fault 或 finally 子句转移回公共语言结构 (CLI) 异常处理程序。
} // end handler IL_0027: nop
IL_0028: ldloc.1 //将索引 1 处的局部变量加载到计算堆栈上
IL_0029: ret //从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上
} // end of method Program::GetValue

通过IL代码和相关的注释,基本可以看出他们的执行流程,猜测出这个方法返回的结果以及静态变量a最后的值是多少。

最后GetValue()方法返回的结果是3;静态变量a的值是5;

但是 “IL_001c: leave.s IL_0027 ”  leave.s 还没看明白怎么回事?有相关熟悉的人,请指点,谢谢!

另外问题提到:有多个return的情况,返回哪个return的结果?  我试了一下,没有发现允许执行多次return的可能!如果有请不吝指出!

最新文章

  1. mssqlserver数据导出到另外一个数据库
  2. Detach Volume 操作 - 每天5分钟玩转 OpenStack(55)
  3. Android HandlerThread 的使用及其Demo (转)
  4. 一起做RGB-D SLAM (1)
  5. git原理图解
  6. 细说SQL 连接
  7. 议:如何将树形菜单形式的数据转化成HTML的二维表(相同内容需合并单元格)
  8. Python笔记3-20151027
  9. jquery层次选择器:空格 > next + nextAll ~ siblings
  10. opencv基础教程 之 图像基础和绘图
  11. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3
  12. 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号
  13. JSOUP 打开url的方式
  14. Python基础05_str_补充
  15. 每月IT摘录201810
  16. 软件工程课堂练习&课下作业
  17. OpenCV——直方图均衡化(用于图像增强)
  18. # 2017-2018-2 20155319《网络对抗技术》Exp9 :Web安全基础
  19. .net大型分布式电子商务架构说明
  20. iOS 一些常见问题

热门文章

  1. bootstrap导航条
  2. Thinkphp发布文章获取第一张图片为缩略图实现方法
  3. python运维开发之第七天
  4. 使用Struts1完成用户登录功能
  5. 基于单例使用ThreadLocal对多线程下数据的访问修改
  6. Android AlarmManager实现不间断轮询服务
  7. 14.1.3 检查InnoDB 可用性:
  8. COJ 0650 绝世难题(一) 可爱的仙人掌
  9. 调用test case集,并生成测试报告
  10. shell中条件判断if中的-z到-d的意思【转载】