根据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(一次编写,随处运行)转换为特定的平台代码的想法非常糟糕,但是对于我的情况来说这是必要的。