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. Week1个人作业

    关于教材的疑问 阅读的教材<构建之法> 1第一章中提到:“软件企业=软件+商业模式”,这样的结构是否过于简单,尤其是在互联网+时代 2.在进行单元测试的时候,怎么做到100%覆盖 3.个人 ...

  2. image 样式设置

    .image-fluid:响应式大小 .image-thumbnails:照片四周会出现一个1px宽的边框 .figure:用于<figure>标签,用来标记一个图像 .figure-ca ...

  3. formidable模块的使用

    Node.js的Formidable模块的使用   今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1)     创建Formidable.IncomingForm ...

  4. Docker(八)-Docker创建Nginx容器

    获取Nginx镜像 最简单的方法就是通过 docker pull nginx 命令来创建 Nginx容器. $ sudo docker pull nginx 或者: $ sudo docker pul ...

  5. Android DatePickerDialog和TimePickerDialog显示样式

    可以用DatePickerDialog显示选取日期的对话框.可以设置显示的样式 1.通过构造方法设置显示样式. 可以通过DatePickerDialog(Context context, int th ...

  6. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  7. 位运算卷积-FWT

    问题 给出两个幂级数 \(f,g\) ,求 \[ h=\sum _i\sum _jx^{i\oplus j}f_ig_j \] 其中 \(\oplus\) 是可拆分的位运算. 算法 由于位运算具有独立 ...

  8. 【bzoj4516】 Sdoi2016—生成魔咒

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 (题目链接) 题意 依次向字符串末尾加上一个字符,每次求不同子串个数. Solution 如果 ...

  9. 国内k8s集群部署的几种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lusyoe/article/details/80217291前言总所周知,由于某种原因,通过官方的方 ...

  10. sqlserver运行脚本数据出现 内存不足的解决办法

    但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行脚本时,往往会遇到“内存不足”的提示. 解决办法: 用微软自带的sqlcmd工具,可以导入执 ...