2.10 异常

  java虚拟机中的异常用Throwable类或者它的子类的实例来表示。抛出一个异常会导致立即非本地(an inmediate nolocal)的控制转移,从发生异常的地方跳到处理异常的地方。

  大多数异常是在当前线程执行某些操作时同步发生的。对应的,非同步异常可能发生在程序执行的任何阶段。java虚拟机会由于下面三个原因中的一个抛出异常:

  • 执行athrow指令
  • java虚拟机同步检测到非正常的执行情况。这些异常不是在程序中的任意点抛出的,而是在执行以下指令后同步抛出:
    • 指明异常作为一种可能的结果,例如

      • 当指令包含违反Java编程语言语义的操作时,例如在访问数组边界外的元素。
      • 程序在加载或者连接的过程中出现错误
    • 导致了使用了超过限制的资源,例如使用了太多的内存。
  • 异步异常出现的原因:
    • 调用了Thread或者ThreadGroup类的stop方法,或者
    • java虚拟机实现出现了内部错误

    一个线程调用stop方法会影响另外一个线程,或者一个限制组的所有线程。它们是异步的异常,因为它们可能出现线程执行的任何位置。内部异常被认为是异步的。

  Java虚拟机可能允许在抛出异步异常之前执行少量但有限制的指令。这种延迟允许优化代码检测并抛出这些异常,这些异常可以在符合Java编程语言语义的情况下处理。

  一个简单的实现可能在每个控件传输指令处轮询异步异常。由于程序的大小是有限的,这就为检测异步异常的总延迟提供了一个界限。由于控制传输之间不会发生异步异常,代码生成器具有一定的灵活性,可以在控制传输之间重新排序计算,以获得更好的性能。The paper Polling Efficiently on Stock Hardware by Marc Feeley, Proc. 1993 Conference on Functional Programming and Computer Architecture, Copenhagen, Denmark, pp. 179–187, is recommended as further reading. 

  java虚拟机抛出的异常是精确的:当发生控制转移时,在抛出异常之前执行的指令的所有效果必须可以被观察到。异常抛出之后的指令应当是没有被执行过。如果虚拟机进行了代码优化,导致了异常抛出之后的代码可能被执行了,那么必须保证执行这些代码造成的影响对用户是不可见的。

  java虚拟机中的每一个方法都会关联0个或者多个异常处理器(exception handlers)。异常处理器描述了其在方法代码中的有效作用范围(通过字节码偏移量来描述)、能处理的异常类型以及处理异常的代码所在的位置。如果导致异常的指令的偏移量在异常处理程序的偏移范围内,并且异常类型与异常处理器处理的异常类的子类相同,则异常与异常处理器匹配。。当抛出异常时,Java虚拟机在当前方法中搜索匹配的异常处理器。如果找到匹配的异常处理器,系统将跳转到异常处理器指定的异常处理代码处执行。

  如果当前方法没有产生异常所对应的异常处理器,当前方法调用会立即结束,当前方法中的操作数栈和局部变量表会被丢弃,栈帧被出栈,恢复调用者方法的栈帧。然后这个异常沿着方法调用链,在调用者栈帧等的上下文中被重新抛出。在到达方法调用链顶层前没有找到合适的异常处理器,异常抛出的线程将被终止。

  方法的异常处理器的顺序在搜索匹配时重要的。在class文件中,每个方法的异常处理器时存在表中。在运行时,当异常抛出时,java虚拟机按照顺序搜索当前方法的异常处理器,顺序是根据它们出现在class文件表的位置,从表的起始处开始。

  请注意,Java虚拟机不强制嵌套或对方法的异常表项进行任何排序。所以java语言中对异常处理的语义,实际上是通过编译器适当安排异常处理器在表中的顺序来协助完成的。在class文件中定义了明确的异常处理器查找顺序,才能确保无论class文件时通过何种途径产生的,java续集及执行时都能有一致的行为表现。

  

  

java虚拟机规范(se8)——java虚拟机结构(五)的更多相关文章

  1. java虚拟机规范(se8)——java虚拟机结构(一)

    本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述 ...

  2. java虚拟机规范(se8)——java虚拟机结构(六)

    2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处 ...

  3. java虚拟机规范(se8)——java虚拟机结构(二)

    2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...

  4. java虚拟机规范(se8)——java虚拟机的编译(四)

    3.12 抛出和处理异常 在程序中使用throw关键字来抛出异常.编译结果很简单. void cantBeZero(int i) throws TestExc { if (i == 0) { thro ...

  5. java虚拟机规范(se8)——java虚拟机的编译(一)

    本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第三章 java虚拟机的编译 java虚拟机是设计用来支持ja ...

  6. java虚拟机规范(se8)——java虚拟机结构(三)

    2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...

  7. java虚拟机规范(se8)——java虚拟机结构(四)

    2.7 对象的表示 java虚拟机并不要求对象满足任何特定的内部结构. 在Oracle的一些Java虚拟机实现中,对类实例的引用是指向句柄的指针,该句柄本身是一对指针:一个指向包含对象方法的表和指向表 ...

  8. java虚拟机规范(se8)——java虚拟机的编译(三)

    3.6 接受参数 如果n个参数传给一个实例的方法,按照约定,它们被接受并放在这个新方法创建的栈帧中的局部变量表里,在局部变量表中的序号从1到n.这些参数按照它们传递过来的顺序存放.例如: int ad ...

  9. java虚拟机规范(se8)——java虚拟机的编译(二)

    3.3 算术运算 java虚拟机通常在操作数栈上进行算术运算(例外情况是iinc指令,它直接增加一个局部变量的值).例如下面的align2grain()方法,它的作用是将int值对齐到2的指定次幂: ...

随机推荐

  1. Xdebug原理

    前言: 前面一篇博文记录了Xdebug的安装配置.配置使用起来相对简单易懂,那么Xdebug的实现原理又是如何呢?所以就找了些资料来理解下其中的原理. 内容: Xdebug工作原理 1,IDE(如Ph ...

  2. Python进阶-配置文件

    一. 什么是配置文件?为什么要做配置文件? 将所有的代码和配置都变成模块化可配置化,这样就提高了代码的重用性,不再每次都去修改代码内部,这个就是我们逐步要做的事情,可配置化 二. 配置文件长啥样? 配 ...

  3. NodeList & null

    NodeList & null querySelectorAll & querySelector let arr = document.querySelectorAll(`[data- ...

  4. delphi clientdataset判断某一行值是否存在

    ClientDataSet的数据查找.我所介绍的心得和技巧都是用ClientDataSet来做范例,也可以应用于其他的一些DataSet.废话就不多说了.我们还是先看代码,让后再总结.1.Scanni ...

  5. JVM学习笔记(四):类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...

  6. 【USACO 1.4】Combination Lock

    /* TASK:combo LANG:C++ URL:http://train.usaco.org/usacoprob2?a=E6RZnAhV9zn&S=combo SOLVE:自己做,想的是 ...

  7. 小记之while循环条件的操作位置

    # 判断条件时自减操作 (循环体判断 len == 0) > 执行顺序为,while(len) → len-- → 循环体 while(len--) { == len) { *buf = i2c ...

  8. CAP定理为什么只能同时满足两个

    Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容忍性) 可靠性 在网上看了很 ...

  9. Python序列化与反序列化-json与pickle

    Python序列化与反序列化-json与pickle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.json的序列化方式与反序列化方式 1>.json序列化 #!/usr ...

  10. saltstack主机管理项目【day39】:主机管理项目开发

    项目目标 salt state.apply -h "ubuntu,centos" -g "ubuntu,centos" -f "ubuntu,cent ...