龙空技术网

Java虚拟机-异常

InfoInsights 37

前言:

此刻同学们对“虚拟机代码怎么运行不了”都比较注意,姐妹们都想要了解一些“虚拟机代码怎么运行不了”的相关内容。那么小编同时在网络上汇集了一些有关“虚拟机代码怎么运行不了””的相关内容,希望咱们能喜欢,小伙伴们快快来学习一下吧!

在Java虚拟机中,异常通过Throwable类或其子类的一个实例来表示。抛出异常会导致从异常抛出点立即进行非本地控制转移。

大多数异常会同步地发生,作为线程中的某个动作的结果。与此相反,异步异常可能在程序执行的任何点发生。Java虚拟机抛出异常有三个原因:

执行了athrow指令。Java虚拟机同步地检测到一个异常执行条件。这些异常不会在程序的任意点抛出,而是仅在执行了指定异常可能结果的指令后同步地抛出,例如:当指令体现的操作违反了Java编程语言的语义,比如数组越界。当加载或链接程序的一部分时发生错误。当某个资源上的限制被超过时,例如使用了太多内存。因为以下原因发生异步异常:调用了Thread类或ThreadGroup的stop方法,或Java虚拟机实现中发生了内部错误。

stop方法可以由一个线程调用以影响另一个线程或指定线程组中的所有线程。它们是异步的,因为它们可能在其他线程的执行的任何点发生。内部错误被视为异步异常。

Java虚拟机可能允许在抛出异步异常之前发生少量但有限的执行。这种延迟被允许是为了让优化的代码能够在实际可处理它们的点检测并抛出这些异常,同时遵守Java编程语言的语义。

一个简单的实现可以在每个控制转移指令的点检查异步异常。由于程序的大小有限,这为检测异步异常提供了总延迟的上限。由于在控制转移之间不会发生异步异常,代码生成器有一些灵活性来在控制转移之间重新排序计算以获得更高的性能。

Java虚拟机抛出的异常是精确的:当控制转移发生时,抛出异常点之前执行的指令的所有效果都必须看起来已经发生。抛出异常点之后的指令不得看起来已经被评估。如果优化的代码推测性地执行了异常点之后的一些指令,这段代码必须准备好将这种推测性执行对程序的用户可见状态隐藏起来。

Java虚拟机的每个方法可以与零个或多个异常处理程序相关联。异常处理程序指定了实现方法的Java虚拟机代码的范围的偏移量,描述了异常处理程序能够处理的异常类型,并指定了处理该异常的代码的位置。如果引起异常的指令的偏移量在异常处理程序的偏移量范围内,并且异常类型与异常处理程序处理的异常类相同或为其子类,则异常与异常处理程序匹配。当抛出异常时,Java虚拟机在当前方法中搜索匹配的异常处理程序。如果找到匹配的异常处理程序,则系统跳转到由匹配的处理程序指定的异常处理代码。

如果在当前方法中找不到这样的异常处理程序,当前方法调用将意外完成。意外完成时,当前方法调用的操作数堆栈和局部变量将被丢弃,并弹出其帧,恢复调用方法的帧。然后在调用者的帧上下文中重新抛出异常,依此类推,继续上溯方法调用链。如果在达到方法调用链顶部之前没有找到合适的异常处理程序,则抛出异常的线程的执行将终止。

方法的异常处理程序搜索匹配的顺序很重要。在类文件中,每个方法的异常处理程序都存储在一个表中。运行时,当抛出异常时,Java虚拟机按照类文件中相应的异常处理程序表中的顺序搜索当前方法的异常处理程序,从该表的开始处开始。

Java虚拟机不强制实施方法的异常表项的嵌套或任何排序。Java编程语言的异常处理语义仅通过与编译器的合作实现。当通过其他方式生成类文件时,定义的搜索程序确保所有Java虚拟机实现的行为一致。

标签: #虚拟机代码怎么运行不了