iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中return和finally哪个先执行
  • 541
分享到

Java中return和finally哪个先执行

2023-06-16 01:06:45 541人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关Java中return和finally哪个先执行,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。源码:public class ReturnFinall

这期内容当中小编将会给大家带来有关Java中return和finally哪个先执行,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

源码

public class ReturnFinallyDemo {     public static void main(String[] args) {         System.out.println(case1());     }      public static int case1() {         int x;         try {             x = 1;             return x;         } finally {             x = 3;         }     } }  # 输出

上述代码的输出可以简单地得出结论:return在finally之前执行,我们来看下字节码层面上发生了什么事情。下面截取case1方法的部分字节码,并且对照源码,将每个指令的含义注释在后面:

iconst_1 // 将常量1推入操作数栈顶  istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1;  iload_0 // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值推入栈顶  istore_1 // 弹出栈顶元素(1),保存到局部变量表slot[1],此时slot[1]=1。其实,此时就已经把要return的值准备好了  iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了  istore_0 // 弹出栈顶元素(3),保存到局部变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3;这里要注意的是,虽然都是更新了x的值,但是finally中的x和try中x的赋值,保存在了不同的局部变量表中 iload_1 // 将局部变量表slot[1]的值推入操作数栈顶,此时栈顶元素的值为1,是第3行指令保存的值  ireturn // 将操作数栈顶的值返回给调用方

从字节码来看,似乎又是finally的代码先执行了,因为ireturn指令确实是在最后执行的,所以返回什么样的值不在于谁先执行,而在于ireturn指令返回的操作数栈顶的元素是何时保存的。在上述代码环境中,是try代码块中給x赋值的版本,也就是紧接着return语句后面的x所保存的版本。

下面再来看一个稍微复杂点的场景:

public static int case2() {     int x;     try {         x = 1;         return ++x;     } finally {         x = 3;     } }  # 输出

有了上面的分析,这个就很好理解了,我们还是来看下字节码:

iconst_1 // 将常量1推入操作数栈顶 istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1; iinc          0, 1 // 对局部变量表slot[0]进行自增(+1)操作,此时slot[0]=2,对应源码:++x;所以,可以看出return后面的表达式先执行 iload_0 // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值(2)推入栈顶 istore_1 // 弹出栈顶元素(2),保存到局部变量表slot[1],此时slot[1]=2。其实,此时就已经把要return的值准备好了 iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了 istore_0 // 弹出栈顶元素(3),保存到局部变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3;这里要注意的是,虽然都是更新了x的值,但是finally中的x和try中x的赋值,保存在了不同的局部变量表中 iload_1 // 将局部变量表slot[1]的值推入操作数栈顶,此时栈顶元素的值为2,是第6行指令保存的值,也就是经过++x之后的值 ireturn // 将操作数栈顶的值返回给调用方

从上述代码可以看出,return后面的指令先执行,然后保存到局部变量表,接着执行finally中的语句,最后执行return指令本身。

总结一下,return指令是最后执行的,如果return后面有表达式,则执行完表达式之后就执行finally中的语句,最后再执行return指令。所以说finally和return到底哪个先执行:return指令后面如果有表达式或方法调用的话,先执行,然后执行finally,最后执行return指令。就像上面的程序演示的结果,不能光从x的赋值来看最终返回结果,从指令层面看,两次对x的赋值,保存在局部变量表的位置不一样。

最后,再来看一个平时不会这么去写的场景:

public static int case3() {     int x;     try {         x = 1;         return ++x;     } finally {         x = 3;         return x;     } } # 输出

这是一个finally返回结果的示例,平时不建议这么写,我们同样从字节码的角度来分析下:

iconst_1 // 将常量1推入操作数栈顶 istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1; iinc          0, 1 // 对局部变量表slot[0]进行自增(+1)操作,此时slot[0]=2,对应源码:++x;所以,可以看出return后面的表达式先执行 iload_0  // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值(2)推入栈顶 istore_1 // 弹出栈顶元素(2),保存到局部变量表slot[1],此时slot[1]=2。 iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了 istore_0 // 弹出栈顶元素(3),保存到变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3 iload_0  // 将局部变量表slot[0]的值(3)推入操作数栈,这是跟之前不一样的地方,ireturn返回的值选择的局部变量表不一样 ireturn

从字节码以及解释来看,直接忽略了try语句块中的return指令,这样的代码会让人产生疑惑,所以平时不建议这么写。本章节就到这里了。

上述就是小编为大家分享的Java中return和finally哪个先执行了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java中return和finally哪个先执行

本文链接: https://www.lsjlt.com/news/282047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中return和finally哪个先执行
    这期内容当中小编将会给大家带来有关Java中return和finally哪个先执行,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。源码:public class ReturnFinall...
    99+
    2023-06-16
  • try、finally与return语句在Java中哪个先执行
    今天就跟大家聊聊有关try、finally与return语句在Java中哪个先执行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Demo1public class Test { p...
    99+
    2023-05-31
    java try finally
  • 深入浅析Java中finally语句与return的执行顺序
    深入浅析Java中finally语句与return的执行顺序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1)try语句没有被执行到,如在try语句之前就返回了,这样fina...
    99+
    2023-05-31
    java return finally
  • sql中where和orderby哪个先执行
    where 语句用于过滤数据,先执行;而 order by 语句用于排序,后执行,顺序为:1. where 语句筛选满足条件的记录;2. order by 语句按指定...
    99+
    2024-05-02
    排列
  • java中finally不执行如何解决
    java中finally不执行如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应...
    99+
    2023-06-14
  • Java中的finally一定会执行吗
    这篇文章主要介绍“Java中的finally一定会执行吗”,在日常操作中,相信很多人在Java中的finally一定会执行吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的finally一定会执行吗...
    99+
    2023-06-29
  • JS中promise的回调和setTimeout的回调哪个先执行
    这篇文章将为大家详细讲解有关JS中promise的回调和setTimeout的回调哪个先执行,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么?c...
    99+
    2023-06-29
  • Java中try-catch-finally执行顺序是什么
    本文小编为大家详细介绍“Java中try-catch-finally执行顺序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中try-catch-finally执行顺序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-02
  • Java和Python哪个先学
    小编给大家分享一下Java和Python哪个先学,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 和 Python 哪个先学呢?比较鱼和熊掌不可兼得。小编建...
    99+
    2023-06-27
  • c#中finally不执行的情况有哪些
    在C#中,finally块中的代码应该会被执行,除非发生以下情况: 程序被强制终止:如果程序被强制终止(如使用kill命令、任务...
    99+
    2024-04-08
    c#
  • Java中try-catch-finally执行顺序你知道吗
    目录引言正文try块中有returncatch块中有returntry块和finally块中有returncatch块和finally块中有returntry块、catch块和fin...
    99+
    2024-04-02
  • Java语言中finally是否一定会执行你知道吗
    目录简介finally 代码块不会运行的情况情况一:代码流程并未进入try语句块情况二: 使用了 System.exit(int) 退出程序情况三:程序所在的线程死亡情况四:其它非正...
    99+
    2024-04-02
  • php和Java先学哪个比较好
    今天小编给大家分享一下php和Java先学哪个比较好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、php与Java的语法...
    99+
    2023-06-27
  • Java中try-catch-finally语法块的执行顺序是怎样的
    这篇文章主要讲解了“Java中try-catch-finally语法块的执行顺序是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中try-catch-finally语法块的执行...
    99+
    2023-06-03
  • 深入浅析java项目中return语句的执行顺序
    本篇文章为大家展示了深入浅析java项目中return语句的执行顺序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。原题try {} 里有一个return语句,那么紧跟在这个try后的finally ...
    99+
    2023-05-31
    java ava return
  • sql中and和or优先级哪个高
    sql 中 and 运算符优先级高于 or 运算符,因此如果两者同时出现,则先执行 and 再执行 or。 SQL 中 AND 和 OR 优先级 在 SQL 中,AND 运算符优先级高...
    99+
    2024-05-12
  • Go语言中延迟执行语句是哪个
    这篇“Go语言中延迟执行语句是哪个”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中延迟执行语句是哪个”文章吧。在Go...
    99+
    2023-07-04
  • linux shell中“.” 和 “./”执行的区别有哪些
    这篇文章将为大家详细讲解有关linux shell中“.” 和 “./”执行的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作...
    99+
    2023-06-09
  • java中多个@Scheduled定时器不执行如何解决
    本篇内容主要讲解“java中多个@Scheduled定时器不执行如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中多个@Scheduled定时器不执行如何解决”吧!项目背景:在项目...
    99+
    2023-07-05
  • Java中Maven的打包方式和执行jar详解
    目录Maven的打包方式和执行jar1. Jar1.1 Pom.xml1.2 Run 1.3 自动执行方法2. Assembl1y2.1 Pom.xml2.2 Run&nb...
    99+
    2023-05-18
    Maven打包方式 jar执行
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作