zoukankan      html  css  js  c++  java
  • try-finally的时候try里面带return

     最近学习的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的值暂存的操作了。

  • 相关阅读:
    计算几何
    HDU 4267
    HDU 4277
    NYOJ 123(插线问点)
    Set
    HDU 1792
    从文本文件读取数据到用vector实现的二维数组中
    为什么计算机采用二进制而不是八进制或者十六进制
    Google C++编程风格指南1
    编程中的命名设计
  • 原文地址:https://www.cnblogs.com/alinainai/p/11133540.html
Copyright © 2011-2022 走看看