JVM 如何执行 Try catch finally 块

2023-12-05

根据 Java 语言规范,第 §14.20.2 节

带有finally 块的try 语句首先执行try 块。然后就有一个选择:

  • If execution of the try block completes normally, then the finally block is executed, and then there is a choice:
    • 如果finally 块正常完成,则try 语句也正常完成。
    • 如果finally 块由于原因S 突然完成,则try 语句也会由于原因S 突然完成

如果我正确解释它,那么在执行 try 块后,finally 就会被调用,但是这一切是如何工作的以及为什么我得到输出,

public static int TestTryFinallyBlock()  
{
    int  i =0;
    try 
    {
        i= 10; //Perform some more operation
        return i;
    }       
    finally
    {
        i = 40; 
    }
}

public static void main( String[] args )
{
    int i1 = TestTryFinallyBlock(); //Here the output was 10 not 40
}   

我想知道这个东西是如何产生输出10的。

就是当执行try块时,遇到return语句,输出值已经入栈,然后执行finally块

我知道首先遇到 return,然后finally 块运行,因此输出为 10,但是jvm 如何解释或 jvm 如何处理或转换 try finally 块?
是jvm使用GOTO节跳转节到finally节还是栈已经维护好了?


经过一番搜索并查看生成了哪些字节码后,我发现实际上并没有看起来的finally块,也没有JVM生成的jump或goto语句。
上面的代码被翻译为(如果我正确解释字节码,如果我错了请纠正我)

public static int TestTryFinallyBlock()  
{
  int returnValue; //A temporary return variable
  try
  {
     int  i = 0;     
     i = 10; 
     returnValue = i; 
     i = 40; 
     return returnValue;    
  }
  catch (RuntimeException e)
  {
       i = 40; //finally section code id copied here too
       throw e;
  }
}

注意事项: If 'i'将是对可变类对象的引用,并且该对象的内容在finally块中被更改,那么这些更改也将反映在返回值中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 如何执行 Try catch finally 块 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的

随机推荐

  • 在 Matlab 中生成矩阵的所有可能组合

    知道该矩阵的元素只能是 0 或 1 如何生成 N M 矩阵的所有可能值 例如 如果我想要一个 2 2 矩阵 我们会得到 16 个具有不同可能组合的矩阵 0 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 等 Us
  • 绝对真实的居中背景图像

    我有一个网站 其中居中的背景图像在主页动画中起着至关重要的作用 背景会一直居中 直到浏览器窗口无法适应网站的宽度 此时背景会左对齐 这是我的身体代码 body line height 1 margin 0px auto padding 0p
  • Kivy 错误:[严重] [应用程序] 无法获取窗口,中止

    我看到的针对这个 Kivy 错误的所有解决方案对我来说都不起作用 现在已经过去两周多了 但我所有的努力都白费了 我使用 python 3 6 4 kivy 1 10 1 pycharm 作为我的 IDE 和 Windows 10 这是错误代
  • Angular – 通过提交表单将组件的新实例添加到显示中,动态加载同一组件的多个实例

    问题更新链接 Problem 我试图动态加载同一组件的多个实例 当用户提交表单时 新组件会添加 加载到屏幕上 其背后的想法是 用户可以提供表单的详细信息 然后将其显示在所创建的组件的特定实例上 我最初的想法是拥有某种数据结构 例如键对值的数
  • JOOQ:使用字符串获取表和列?

    您好 我正在将 JOOQ 与 Spring Boot 结合使用 想知道是否有办法获取表及其列及其名称字符串 例如 我希望能够通过执行以下操作来获得一张桌子 someObject getTable user 然后使用该 get 方法的结果 我
  • Vagrant 错误:无法在 Linux 来宾中挂载文件夹

    我对 Vagrant 共享文件夹有一些问题 我的基本系统是 Ubuntu 13 10 桌面 我不明白为什么我会出现此错误 是配置不正确吗 是 NFS 问题还是 Virtualbox Guest Additions 问题 我尝试过使用不同的许
  • 当用户尝试在 vb6 中打开新实例时返回到已打开的应用程序

    假设用户将我的 Visual Basic 应用程序最小化到任务栏通知图标 现在我希望当用户打开一个新实例时 旧实例应该恢复 通常 创建单实例应用程序的策略是在应用程序初始化中添加一些代码来确定实例是否已在运行 如果是 它会获取主窗口的句柄
  • 对 d3.js 堆积条形图进行排序

    目前这个堆积条形图根据每个条形的总计从左到右排序 我还如何对每个单独的条形图进行排序 而不是按键对每个单独的条形图进行排序 即 5 岁以下位于底部 65 岁及以上位于顶部 而是按值 最大 对每个单独的条形图进行排序位于底部 最小位于顶部 例
  • Fabric.js 定义图像的边界/限制

    I ve set up a fabric js based t shirt simulator Everything works as expected except for one detail that the client would
  • 如何在 Java 应用程序中使用 Akka Actors?

    我想用阿卡演员在爪哇 我下载了akka 1 0 zip并添加了akka actor 1 0 jar到我在 Eclipse 中的 构建路径 然后我写了这个 Actor 类 package com example import akka act
  • 剪切工具滞后荧光笔

    我尝试在 C Winforms 中创建荧光笔 我使用的大部分代码都在这里像截图工具一样突出显示效果但当我尝试画得太快时 它就会滞后 不确定我做错了什么 这是我尝试过的 private void pictureBox1 Paint objec
  • Flutter - 从数据库中获取记录并显示在 ListView Builder 中

    我正在开发一个 Flutter 项目并使用 Sqflite 数据库 我已经设法将数据保存在数据库中 现在我试图根据表名从数据库中获取所有记录的列表 并将它们显示在 ListView builder 中 数据库助手 dart Future
  • 安装cordova时卡住了

    我正在按照cordova主页上的步骤操作 但第一步我很困惑 我输入了sudo npm install g cordova在终端 但它卡住了 loadDep Xtend 网络 这需要几个小时 但没有进一步的进展 实际上 我在中国 我想这可能是
  • Java Web 应用程序。春季启动。定位图像

    我最近解决了在这个社区中定位图像的问题 你可以看here 然而 有一个答案说 您的应用程序是 Spring Boot 应用程序 我认为您还可以尝试使用 Spring Boot 提供的设施来提供静态内容 不管怎样 你现在正在这样做 因为你正在
  • HTML5 canvas 类上的 jQuery getContext

    这段代码的工作原理
  • Numpy 数组的长整数形状

    如果我构造一个像这样的 numpy 矩阵 A array 1 2 3 4 5 6 然后输入A shape我得到结果 2L 3L 为什么我得到的形状格式很长 我可以重新启动一切 但仍然遇到同样的问题 据我所知 只有当我构造数组时才会遇到这个问
  • Rails Paperclip 只能用于图像吗?

    是否有任何 Rails 库用于管理与 ActiveRecord 连接的文件附件 I know 回形针 但它似乎主要适合图像 他们确实提到了音频和 pdf 文件github项目页面 但没有进一步解释不同文件类型的用法 属性如 style如果您
  • ARM直接内存操作

    ARM中有支持直接内存操作的指令吗 所以而不是 cc cc 100 mov r3 0 ldr r1 r3 0 add r1 r1 100 str r1 r3 0 它是否有类似或接近的东西 add r3 0 100 I know this i
  • MongoEngine 指定查询的读取首选项

    我正在使用 Mongo 2 6 Pymongo 2 7 2 和 Mongoengine 0 8 7 对于特定的读取查询 我想使用副本集的辅助副本 因此 正如 mongoengine 文档中所指定的here我的查询如下 from pymong
  • JVM 如何执行 Try catch finally 块

    根据 Java 语言规范 第 14 20 2 节 带有finally 块的try 语句首先执行try 块 然后就有一个选择 If execution of the try block completes normally then the