这两天,有人咨询我一道关于java基础的题,具体代码如下:

 private static int m1() {
int a = 10;
try {
a = 20;
throw new RuntimeException();
} catch (Exception e) {
a = 30;
return a;
} finally {
a = 40;
}
}

他问我这个方法的返回结果是多少?finally代码块不是一定会执行的吗?a不是赋值了40?为什么a返回的是30?
我说返回30,具体为什么是30呢?,为了更有说服力,我把上面代码的class进行反编译,得到如下代码:

 private static int m1(){
int a = 10;
try {
  a = 20;
  throw new RuntimeException();
} catch (Exception e){
  e = e;
  a = 30;
  int i = a;
  a = 40;return i;
} finally {
  localObject = finally;
  a = 40;
  throw ((Throwable)localObject);
}
}

我们看第9和第10两行代码,心里是否已经有了答案?之所以结果是30是因为return返回的是i,而i是由a赋值30后赋值给的i。

总结:首先a初始化赋值为10,接着a重新赋值为了20,然后throw抛出异常catch被执行,所以a再次被赋值为30,接着把a赋值给i,所以i为30。当return的时候本来应该是直接返回i的,但是程序还要执行finally代码块,所以程序把i先放到暂存。最后虽然a被赋值为了40,但是程序返回的是i(30)。

最新文章

  1. bcp 命令实例
  2. Hyper-V~双网卡设置
  3. HTML5第二节
  4. tornado + supervisor + nginx 的一点记录
  5. 带你玩转JavaWeb开发之三 - CSS从基础到实战
  6. mac安装Mysql官方示例数据库employee
  7. Linux网络管理
  8. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
  9. android布局之线性布局
  10. JAVAC 命令使用方法
  11. 需要注意的subList方法!和substring是不一样的!从源码解释他们的不同。
  12. mongodb 数据备份与恢复
  13. [Swift]LeetCode801. 使序列递增的最小交换次数 | Minimum Swaps To Make Sequences Increasing
  14. leetcode题解 9. Palindrome Number
  15. 解决weblogic 部署环境后出现的乱码问题
  16. AttributeError: module '__main__' has no attribute 'main'解决方法
  17. 【VMware vSphere】使用U盘给戴尔服务器安装ESXi6.0系统
  18. CSS的再深入5(更新中···)
  19. 2018-2019-1 20189221 《Linux内核原理与分析》第七周作业
  20. flask框架----flask入门

热门文章

  1. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
  2. 动态代理(CGLIB实现)
  3. mybatis一级缓存与二级缓存的原理
  4. 机器学习笔记(五) K-近邻算法
  5. 如何在ASP.NET Core 2.0中使用Razor页面
  6. 并发编程>>四种实现方式(三)
  7. 思科设备配置DHCP服务
  8. (转)Memcached 之 .NET(C#)实例分析
  9. 【gcc】命令记录
  10. 测试Servlet生命周期例子程序