最近学习的JVM小册中老师提了个问题:

  最开始我觉得是1,结果程序跑出来是0,感到很疑惑,于是查看了下字节码:

  

  从字节码可以看出:

  0:定义变量0

  1:将0存入本地变量表slot-0

  2:加载slot-0到操作数栈

  3:将栈顶元素存入本地变量表slot-1

  4:对slot-0自增

  7-8:加载slot-1到操作数栈并返回

  可以看到,最终返回的是slot-1的值,而自增的是slot-0的值,所以最终还是返回的0

  但是为什么JVM要这么做的原因的还是不太清楚,看了Java虚拟机规范上面写的:

  https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.2.5

  规范这里也说的是如果try里面有return,那么编译的时候会先把try的返回值存入到本地变量表中。看到这里我有了一些猜测:

  try-finally的原理是编译的时候在return之前插入了jsr指令,执行该指令会跳到finally block,finally block这个时候被编译成了一个subroutine(子程序),

也就是一个方法,那么为了当从subroutine跳转出来的时候能够继续返回原来要返回的值,所以在执行finally block之前会先把try的返回值存入本地变量表中一个新的slot,而在finally

当中如果有操作try的返回值这个变量的时候,实际操作的是该值原本所在的slot,,说的有点绕,不太好理解,望见谅。

  老师在群里发了个javac编译的代码,这个比较清楚:

  所以大致可以总结为:当try有return的时候,finally里面对try的返回值的操作不起作用。我们也可以将程序改一下:

  当try里面没有return的时候,则返回1。在看看此时的字节码:

  这个时候,就没有将return的值暂存的操作了。

try-finally的时候try里面带return的更多相关文章

  1. 装饰器1、无参数的装饰器 2、有参数的装饰器 3、装饰器本身带参数的以及如果函数带return结果的情况

     装饰器分成三种: 1.无参数的: 2.有参数的: 3.装饰器本身带参数的. 装饰器decorator又叫语法糖 定义:本质是函数,器就是函数的意思.装饰其他函数.就是为其他函数添加附加功能. 原则: ...

  2. 理清Java中try-catch-finally带return的执行顺序

    前言:try-catch-finally带return和异常时,它们之间执行顺序问题是留下来的一个小疑问,今天搞清楚它们 第一种情况:无异常 //1.try-catch-finally都带有retur ...

  3. python学习,day3:函数式编程,带return

    return的主要作用就是,在调用的时候,能知道函数的运行情况,相当于打个标签 # coding=utf-8 # Author: RyAn Bi def test1(): print('in the ...

  4. JAVA中try、catch、finally带return的执行顺序总结

    异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→final ...

  5. java return

    return语句的作用: 1.返回一个值,可以是任意类型的 2.使程序返回到操作系统,或者说是代表"已经做完,离开此方法" ---------------------------- ...

  6. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  7. 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序

    大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...

  8. java递归算法提前返回值带出

    /** * */ package testJava.java.foreach; import java.util.ArrayList; import java.util.LinkedList; imp ...

  9. return语句的用法

    1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序)2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句.但是区别在于,r ...

随机推荐

  1. 牛顿迭代法解非线性方程组(MATLAB版)

    牛顿迭代法,又名切线法,这里不详细介绍,简单说明每一次牛顿迭代的运算:首先将各个方程式在一个根的估计值处线性化(泰勒展开式忽略高阶余项),然后求解线性化后的方程组,最后再更新根的估计值.下面以求解最简 ...

  2. 区间查询与等效minus查询

    --表结构 create table hy_emp( id number(4,0) primary key, name nvarchar2(20) not null, edate date) --充值 ...

  3. SpringMVC-整合SSM

    整合SSM 目录 整合SSM 1. 设计流程 2. 创建一个数据库表 3. 配置依赖 4. 准备项目框架 5. Mybatis层 1. 编写实体类 2. 编写Mapper接口和xml 1. Mappi ...

  4. Linux:apache安装

    1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载   rpm -e --nodeps httpd-2. ...

  5. html基础:css样式1

    h't'm'l中用到css样式有三种方式: 1.在header中增加style标签,在style标签中写 2.用link标签引用css样式文件 3.在需要使用css样式的标签添加style属性 一.在 ...

  6. 微信小程序-组件-基础内容

    1.text 1.作用:类似html的行内元素 2.常用属性: -space值:ensp:中文字符空格一半大小 emsp:中文字符空格大小 nbsp:根据设置字体的大小决定空格大小 -decode:d ...

  7. 如何使用dockerfile将jar包生成镜像

    1.编写dockersfile FROM java:8 ADD SPRINGCLOUD.jar app.jar RUN bash -c ‘touch /app.jar’ ENTRYPOINT [&qu ...

  8. [补题][Codeforces478D]Red-Green Towers(DP)

    题目链接 http://codeforces.com/problemset/problem/478/D 题意 叠放塔:有红.绿两种色块.从第一层开始,第一层1块,第二层2块,第i层i块. 要求每一层只 ...

  9. Nginx反代MogileFS集群

    上一篇博文我们主要聊了下分布式文件系统MogileFS的组件以及部署使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13677279.html:今天我们主要 ...

  10. java安全编码指南之:堆污染Heap pollution

    目录 简介 产生堆污染的例子 更通用的例子 可变参数 简介 什么是堆污染呢?堆污染是指当参数化类型变量引用的对象不是该参数化类型的对象时而发生的. 我们知道在JDK5中,引入了泛型的概念,我们可以在创 ...