首页 > 其他分享 >try-finally【面试题】

try-finally【面试题】

时间:2023-04-12 22:09:30浏览次数:29  
标签:面试题 String astore try finally 本地 line hello 变量


首先来看一段代码

public String method111() {
    String ret = "hello";
    try {
return ret;
    } finally {
        ret = "world";
    }
}

最终返回什么呢?可能你知道,但是相信有一部分人是懵了的,因为我们都知道try-finally代码中finally模块最终一定会执行。下面咱们通过java字节码指令来看看到底发生了什么。

首先找到.class文件,然后执行

javap -verbose Test.class >tt.tx

然后保存到tt.txt文件中

public java.lang.String method111();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=4, args_size=1
        0: ldc           #2 //把常量池中的常量压到操作数栈里// String hello
        2: astore_1      //然后存到本地变量1中
         3: aload_1       //加载本地变量1到操作数栈
         4: astore_2      //再把它保存到本地变量2中
         5: ldc           #3 //把常量池中的常量压到操作数栈里// String world
        7: astore_1      //然后存到本地变量1中
         8: aload_2       //加载本地变量2到操作数栈
         9: areturn       //返回栈里的数据 hello 因为本地变量保存的是hello
        10: astore_3
        11: ldc           #3                  // String world
        13: astore_1
        14: aload_3
        15: athrow
      Exception table:
         from    to  target type
             3     5    10   any
      LineNumberTable:
        line 7: 0
        line 9: 3
        line 11: 5
        line 9: 8
        line 11: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  this   Lcom/u2jinfu/com/requestbank/controller/Test;

3 13 1 ret Ljava/lang/String;

.....其他部分省略

由字节码指令可以看出,显示把hello保存到本地变1和本地变量2中。后面返回的是本地变量2,所以返回的就是hello,通过现象看本质。


标签:面试题,String,astore,try,finally,本地,line,hello,变量
From: https://blog.51cto.com/u_11702014/6186295

相关文章

  • 字符串拼接【面试题】
    先来看一段代码publicclassTest{publicStringmethod1(){Stringret="";for(inti=0;i<100000;i++){ret=ret+"ok";}returnret;}publicStringmethod2(){StringBuilderret=newStringB......
  • 2-面试题:python
    1、python对象的比较和拷贝?答:'=='操作符比较对象之间的值是否相等;'is'操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址;比较操作符'is'的速度效率,通常优于'==';浅拷贝和深拷贝:浅拷贝,将原对象或原数组的引用直接赋值给新对象、新数组,新对象/......
  • 面试题:python
    列表和元组的区别列表是动态的,长度可变,可以对元素进行增、删、改操作;列表存储空间略大于元组,性能略逊于元组;元组是静态的,长度大小固定,不可以对元素进行增、删、改操作;元组相对于列表更加轻量级,性能稍优;字典和集合字典是有序的数据结构,而集合是无序的,其内部的哈希表存储结构,......
  • 前端面试题
    一、什么是JavaScript? 二、JavaScript中的hoisting是什么?  三、什么是闭包四、说一说this指向(普通函数、箭头函数)   五、说几个未知宽高元素水平垂直居中方法    6、说一说cookiesessionStoragelocalStorage是什么,有什么区别?7、说一说Vue2.0双向......
  • #yyds干货盘点# LeetCode面试题:矩阵置零
    1.简述:给定一个 mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。 示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]......
  • 锁屏面试题百日百刷-kafk篇(一)
    锁屏面试题百日百刷,每个工作日坚持更新面试题。请看到最后就能获取你想要的,接下来的是今日的面试题:1.请说明什么是ApacheKafka?ApacheKafka是由Apache开发的一种发布订阅消息系统,它是一个分布式的、分区的和重复的日志服务。2.请说明什么是传统的消息传递方法?传统的消息传递......
  • 软件测试综合面试题
    项目中会对接第三方系统吗,哪些系统在项目中对接第三方系统是非常常见的。常见的对接的第三方系统包括但不限于以下几种:1.支付系统:例如支付宝、微信支付、银联支付等。如果项目需要接入支付功能,就需要对接相应的支付系统。2.物流系统:例如顺丰、圆通、中通等。如果项目中需要使......
  • Go面试题——逃逸分析
    Go面试题——逃逸分析一个变量是在堆分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的"结论"。一、逃逸分析是什么?在C语言中,可以使用malloc和free手动在堆上分配和回收内存。在Go语言中,堆内存是通过垃圾回收机制自动管理的,无需开发者指定。那么,Go编译器......
  • .NET开发工程师面试题
     一个网友参加了某公司的.NET开发工程师面试。该公司正在招聘一位薪资水平在20K-25k之间的优秀.NET开发工程师。为了帮助大家更好地了解.NET开发领域的要求和应试技巧,小编将与大家分享这个职位的面试题目。题目如下,大家先自己模拟回答一下,然后再看后面的答案。题目请简述.NET......
  • js相关面试题
    1.js的基础类型有什么?基础类型有:null,NaN,string,number,boolean,bigint,symbol,undefine引用类型有:object,Array,function2.tyopef和instanceof的区别:1.typeof可以识别所有的值类型,识别函数,能区分是否是引用类型consta="str" console.log(typeofa)  //stringconstb=999 c......