Java虚拟机里面的异常使用Throwable或其子类的实例来表示,抛异常的本质实际上是程序控制权的一种即时的、非局部(Nonlocal)的转换——从异常抛出的地方转换至处理异常的地方。

绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的,这种可以称为是同步的异常。与之相对的,异步异常是指在程序的其他任意地方进行的动作而导致的异常。Java虚拟机中异常的出现总是由下面三种原因之一导致的:

1.虚拟机同步检测到程序发生了非正常的执行情况,这时异常将会紧接着在发生非正常执行情况的字节码指令之后抛出。例如:

  • 字节码指令所蕴含的操作违反了Java语言的语义,如访问一个超出数组边界范围的元素。

  • 类在加载或者链接时出现错误。

  • 使用某些资源的时候产生资源限制,例如使用了太多的内存。

2.athrow字节码指令被执行。

3.由于以下原因,导致了异步异常的出现:

  • 调用了Thread或者ThreadGroup的stop方法。

  • Java虚拟机实现的内部程序错误。

当某条线程调用了stop方法时,将会影响到其他的线程,或者在线程组中的所有线程。这时候其他线程中出现的异常就是异步异常,因为这些异常可能出现在程序执行过程的任何位置。虚拟机的内部异常也被认为是一种异步异常

《Java虚拟机规范》允许在异步异常被抛出时额外执行一小段有限的代码,允许代码优化器在不违反Java语言语义的前提下检测并把这些异常在可处理它们的地方抛出①。

抛出异常的动作在Java虚拟机之中是一种被精确定义的程序控制权转移过程,当异常抛出、程序控制权发生转移的那一刻,所有在异常抛出的位置之前的字节码指令所产生的影响②都应当是可以被观察到的,而在异常抛出的位置之后的字节码指令,则应当是没有被执行过的。如果虚拟机执行的代码是被优化后的代码③,有一些在异常出现位置之后的代码可能已经被执行了,那这些优化过的代码必须保证被它们提前执行所产生的影响对用户程序来说都是不可见的。

由Java虚拟机执行的每一个方法都会配有零至多个异常处理器(Exception Handlers),异常处理器描述了其在方法代码中的有效作用范围(通过字节码偏移量范围来描述)、能处理的异常类型以及处理异常的代码所在的位置。要判断某个异常处理器是否可以处理某个具体的异常,需要同时检查异常出现的位置是否在异常处理的有效作用范围内并且出现的异常是否异常处理器声明可以处理的异常类型或其子类型两个条件。当有异常被抛出时,Java虚拟机搜索当前方法的包含的各个异常处理器,如果能找到可以处理该异常的异常处理器,则将代码控制权转向到异常处理器中描述的处理异常的分支之中。

搜索异常处理器时的搜索顺序是很关键的,在Class文件里面,每个方法的异常处理器都存储在一个表中。在运行时,当有异常出现之后,Java虚拟机就按照Class文件中的异常处理器表描述异常处理器的先后顺序,从前至后进行搜索。

需要注意,Java虚拟机本身不会对方法的对异常处理器表做排序或者其他方式的强制处理,所以Java语言中对异常处理的语义,实际上是通过编译器适当安排异常处理器在表中的顺序来协助完成的。在Class文件中定义了明确的异常处理器查找顺序,才能保证无论Class文件是通过何种途径产生的,Java虚拟机执行时都能有一致的行为表现。

转载于:https://blog.51cto.com/zangyanan/1855720

java虚拟机规范阅读(三)异常相关推荐

  1. Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

    什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置 ...

  2. 《java虚拟机规范SE7》整理——第三章:为Java虚拟机编译

    按照<java虚拟机规范SE7>章节顺序整理的笔记. 目录: 常量.局部变量的使用和控制结构 算术运算 访问运行时常量池 接收参数 方法调用 使用类实例 数组 编译switch语句 抛出异 ...

  3. 深入理解JAVA虚拟机——个人阅读笔记

    阅读前说明 因为这里原本没想过分享出来, 做笔记时对个别不会的概念直接引用了部分的网址,如果构成侵权或者有侵权的嫌疑,无论是作者亦是读者,请联系我,将立刻删除该部分,并表示道歉. 这里笔记只是面向我个 ...

  4. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  5. Java虚拟机规范 Java SE 8版 - class文件格式(二)

    Java虚拟机规范 Java SE 8版 - class文件格式(二) 4.5 字段 4.6 方法 4.7 属性 4.7.1 自定义和命名新的属性 4.7.2 ConstantValue 属性 4.7 ...

  6. 《java虚拟机规范SE7》整理——第四章:Class文件格式

    按照<java虚拟机规范SE7>章节顺序整理的笔记. 目录: ClassFile格式(注:也就是class文件的总结构) 描述符和签名 常量池 字段 方法 属性 Java虚拟机代码约束 C ...

  7. 《java虚拟机规范SE7》整理——第二章:Java虚拟机结构

    按照<java虚拟机规范SE7>章节顺序整理的笔记. 第二章:java虚拟机的结构 目录: 数据类型 运行时数据区 栈帧 浮点算法 字节码指令集 一. 数据类型 虚拟机可以操作的类型可以分 ...

  8. 《Java虚拟机规范》读书笔记,平安银行java开发面试

    由java文件编译成的class文件是独立于硬件和操作系统的二进制编码文件,在虚拟机上运行. 数据类型 Java虚拟机中可以操作的数据类型可以分为两类:原始类型 (Primitive Types) 和 ...

  9. 《深入理解Java虚拟机》阅读——垃圾回收机制

    <深入理解Java虚拟机>阅读--垃圾回收机制 前言 why--为什么需要垃圾回收 what--垃圾回收做些什么 where--去哪里回收垃圾 how--垃圾回收是怎么做的 垃圾是否要回收 ...

最新文章

  1. 倒计时1天!「2019 Python开发者日」报名即将关闭(附参会提醒)
  2. java.lang.NoSuchFieldError: deferredExpression
  3. JavaSE各阶段练习题----Map
  4. #3601. 一个人的数论
  5. linux vps 运行exe文件夹,linux 64位下安装wine1.6 Windows模拟器(用来运行.exe文件) 编译安装32位wine...
  6. 深圳 | 腾讯AI Lab招聘CVCG研究员及实习生
  7. Week09《java程序设计》第九次作业总结
  8. 【Kettle】血统分析
  9. 一文读懂nginx charset
  10. 【linux 学习】在Linux中经常用到的cmake、make、make install等命令解析
  11. centos7 shell脚本开机自启动(亲测可用)
  12. 知名APP(支付宝、微信、花瓣等)首页设计技巧及原型实例讲解
  13. 基于大数据的音乐数据中心平台(附:源码 课件 项目部署文档)
  14. 下载电影 php文件 迅雷9,迅雷9怎么下载看片?迅雷9正确找片找资源的多种方法...
  15. 国家税务总局增值税发票查验平台不显示验证码的解决方法
  16. Bad Ugly Numbers
  17. Cytoscape.js – 用于数据分析和可视化的交互图形库
  18. 几何画板(可绘制复杂函数等)下载方式
  19. FPGA中DDR3 mig核的时钟以及带宽说明
  20. linux 修改proc目录,Linux_Linux中系统参数修改命令sysctl的使用讲解,sysctl配置与显示在/proc/sys目录 - phpStudy...

热门文章

  1. java设计模式之道文字版,Java Web设计模式之道 PDF
  2. 如何备份数据_如何通过归档、备份和灾难恢复实现多云数据保护
  3. java jnotify_Jnotify文件监控的用法以及Jar文件导入的方法
  4. php strlen ctf,CTF中的PHP反序列化漏洞简单分析
  5. 水面反光如何拍摄_拍摄水面反射的创意
  6. python3库查看调用_Python 3 中调用 COM 的库文件 | 学步园
  7. php 504网关,504 gateway timeout什么意思
  8. mysql必学十大必会_MYSQL 学习(一)--启蒙篇《MYSQL必知必会》
  9. java中operationBox_Java使用PDFBox开发包实现对PDF文档内容编辑与保存
  10. 计算机的好处英语,电脑的好处英语演讲稿