当前位置: 首页 > 面试题库 >

JVM如何执行Try catch finally块

马峻
2023-03-14
问题内容

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

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

  • 如果try块的执行正常完成,则执行finally块,然后可以选择:
    • 如果finally块正常完成,则try语句正常完成。
    • 如果finally块由于原因S突然完成,则try语句由于原因S突然完成

如果我正确地解释了它,那么在执行try块之后最终会被调用,但是所有这些如何工作以及为什么得到输出,

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节的跳转节去到final节还是堆栈已经维护了?


问题答案:

稍作搜索后,看到生成了什么字节码,我发现实际上似乎没有finally块,并且JVM也没有生成跳转或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;
  }
}

注意: 如果'i'是对可变类对象的引用,并且对象的内容在finally块中更改,则这些更改也将反映在返回的值中。



 类似资料:
  • 问题内容: 这个问题的目的 是JVM如何保证finally块的执行 (前提是JVM不会崩溃并且线程不会中断或退出)。 在面试问题的提示下,我试图了解JVM如何确保即使在奇怪的情况下也可以执行finally块。请考虑以下代码: 尽管这可能是一个奇怪的情况,但是即使未明确处理“ 其他异常”, 仍可以保证执行finally块。JVM如何处理这种情况? 我的想法: 据我到目前为止的了解和了解,当遇到未处理

  • ipush 放到操作数栈 istore 到本地变量表 div 除 getstatic #2->常量池中的#2 找到函数 符号引用转为直接引用 接下来是invokevirtual 最后肯定有一个return 这个实例还没有涉及到堆空间,如果涉及到堆空间的话很复杂,涉及引用变量

  • 主要内容:执行引擎概述,Java代码编译和执行过程,机器码、指令、汇编语言,解释器执行引擎概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部 ,但字节码并不能够

  • 我正在努力获得Cucumber-JVM V4.0.0与JUnit/Maven一起工作的新并行执行特性。 如前所述,如果在POM中相应地配置和,并使用依赖项注入来共享状态(我使用的是Pico Continer),那么Cucumber特性应该并行执行。 如果有用的话,下面是我的runner类(com.softwareAutomation.world是DI类) 请参阅下面从Maven运行时的失败堆栈跟踪

  • 我在eclipse工作区中有一个java项目,它将用数据创建excel表。我将整个项目导出为一个可执行的jar文件,通过双击jar文件,可以在JVM的帮助下运行。双击JAR后,我可以看到在windows任务管理器的Processes选项卡下创建了一个带有javaw.exe的新进程。问题是,如何知道我的java代码是否运行并创建了带有数据的excel表。 我知道,我可以提取jar内容并检查excel

  • 我需要找到一种方法让我的java程序在没有Java的计算机上运行。我为我的学校做了一个非常简单的调查/回答类型的程序,为了更容易使用,我使用了一个包装器(具体来说是J平滑的)。但是对于没有安装Java的老师来说,这个程序似乎无法执行。有没有包装器允许在没有安装JVM的情况下执行Java代码?我知道将Java(一次编写,随处运行)转换为特定的平台代码的想法非常糟糕,但是对于我的情况来说这是必要的。