当前位置: 首页 > 知识库问答 >
问题:

JVM如何“抛出”异常

万俟铭
2023-03-14

我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。

JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。

共有1个答案

南宫博简
2023-03-14

irem是“逻辑整数余数”运算符。Java虚拟机规范写道:

运行时异常

如果int余数运算符的除数值为0,则IREM抛出ArithmeticException

例如,Intel 64和IA-32架构软件开发人员手册合并卷3A、3B和3C:系统编程指南写道:

6.1中断和异常概述

当处理器在执行一条指令时检测到错误条件,例如除以零时,就会发生异常。处理器检测各种错误情况,包括违反保护、页面错误和内部机器故障。Pentium4、Intel Xeon、P6系列和Pentium处理器的机器检查架构还允许在检测到内部硬件错误和总线错误时生成机器检查异常。

当接收到一个中断或检测到一个异常时,当前正在运行的过程或任务在处理器执行一个中断或异常ha ndler的同时被挂起。当处理程序的执行完成时,处理器恢复中断的过程或任务的执行。中断过程或任务的恢复不会失去程序的连续性,除非无法从异常中恢复或中断导致当前运行的程序终止。

因此,JVM将定义异常处理程序以创建一个异常对象,在一个已知的寄存器中保留对它的引用,然后继续执行athrow字节码指令。

 类似资料:
  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 我有一个异步函数,我希望在失败时抛出异常。然而,似乎有一些东西阻止了这一点: 通过省略try catch块,我希望抛出一个异常,我想在函数外部处理这个异常。 我得到的实际结果有点令人困惑: 当我尝试捕获异常并抛出其他东西时,会得到相同的结果: 该函数是从try块调用的,因此看不到这如何是未处理的promise。 我正在尝试使用< code>f作为另一个函数的参数:

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 我有下面的代码块。我得到的是的catch块没有处理它。有人能告诉我如何处理下面的块抛出的异常吗?

  • 在JUnit5中有更好的方法来断言方法抛出异常吗? 目前,我必须使用@规则来验证我的测试是否抛出了异常,但这对于我期望多个方法在我的测试中抛出异常的情况不起作用。

  • 问题内容: 考虑一下程序: 如果程序不带参数启动,则运行时类路径中是否需要Foo? 研究 报告链接错误时,Java语言规范相当模糊: 该规范为实现链接活动(以及由于递归,加载)的发生时间提供了实现上的灵活性,前提是尊重Java编程语言的语义,并且在初始化类或接口之前已对其进行了完全验证和准备,并且在链接过程中检测到的错误被抛出到程序中某个位置,在该位置程序执行了一些可能需要链接到错误所涉及的类或接