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虚拟机结构(五)的更多相关文章
-
java虚拟机规范(se8)——java虚拟机结构(一)
本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述 ...
-
java虚拟机规范(se8)——java虚拟机结构(六)
2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处 ...
-
java虚拟机规范(se8)——java虚拟机结构(二)
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...
-
java虚拟机规范(se8)——java虚拟机的编译(四)
3.12 抛出和处理异常 在程序中使用throw关键字来抛出异常.编译结果很简单. void cantBeZero(int i) throws TestExc { if (i == 0) { thro ...
-
java虚拟机规范(se8)——java虚拟机的编译(一)
本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第三章 java虚拟机的编译 java虚拟机是设计用来支持ja ...
-
java虚拟机规范(se8)——java虚拟机结构(三)
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...
-
java虚拟机规范(se8)——java虚拟机结构(四)
2.7 对象的表示 java虚拟机并不要求对象满足任何特定的内部结构. 在Oracle的一些Java虚拟机实现中,对类实例的引用是指向句柄的指针,该句柄本身是一对指针:一个指向包含对象方法的表和指向表 ...
-
java虚拟机规范(se8)——java虚拟机的编译(三)
3.6 接受参数 如果n个参数传给一个实例的方法,按照约定,它们被接受并放在这个新方法创建的栈帧中的局部变量表里,在局部变量表中的序号从1到n.这些参数按照它们传递过来的顺序存放.例如: int ad ...
-
java虚拟机规范(se8)——java虚拟机的编译(二)
3.3 算术运算 java虚拟机通常在操作数栈上进行算术运算(例外情况是iinc指令,它直接增加一个局部变量的值).例如下面的align2grain()方法,它的作用是将int值对齐到2的指定次幂: ...
随机推荐
-
用js 向h5 中的table 动态添加数据 (简单实现)
//向 表格传值 function setTextareaValue(items,pp){ console.log(" 进入函数 items=="+items); var tb = ...
-
Codeforces Beta Round #85 (Div. 1 Only) B. Petya and Divisors 暴力
B. Petya and Divisors Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/111 ...
-
Break、continue、return用法(C++)
(1)break 直接调出当前循环体.如果是嵌套循环,他只能调出一层循环体. Exp-1: 程序: #include<iostream> using namespace std; int ...
-
mysql单表大小的限制
mysql单表大小的限制一.MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了.在mysql5. ...
-
动态库的链接和链接选项-L,-rpath-link,-rpath
https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行 ...
-
Sql Server 阻塞的常见原因和解决办法
1. 由于语句运行时间太长而导致的阻塞,语句本身在正常运行中,只须等待某些系统资源 解决办法: a. 语句本身有没有可优化的空间 b. Sql Server 整体性能如何,是不是有资源瓶颈影响了语句执 ...
-
Socket网络编程--简单Web服务器(1)
这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码 ...
-
Debug---Eclipse断点调试基础
1.进入debug模式(基础知识列表)1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ========================= ...
-
glsl 多重纹理
#include"glsl.h" void SHADER::drawBox() { glBegin(GL_QUADS); // Front Face glNormal3f( 0.0 ...
-
DjVu转PDG的方法与步骤
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03更新:2008.08.24 补充说明:此文成文较早,当时PDG浏览器只支持纯正PDG,不支持名为PDG,实 ...