1引言异常(exception)是可被硬件或软件检测到的要求进行特殊处理的异常事件.异常处理作为程序设计语言的组成部分,为开发可靠性软件系统提供了强有力的支持.Java作为一优秀的程序设计语言不仅具有面向对象、并发、平台中立等特点,同时也定义了灵活的异常处理机制,Java虚拟机是这一机制的具体实施者.本文详细论述了Java语言的异常处理机制,并结合国产开放系统平台COSIX虚拟机异常处理的设计,深入探讨了在解释执行和及时编译执行两种不同的情况下,异常处理设计与实现的关键技术.2Java语言及虚拟机的异常处理机制Java语言在设计上与C++有许多相同之处,它的异常处理机制基本上沿袭了C++的规则[1].Java的异常处理语句及抛出异常语句与相应的C++的语句完全一样,它的异常处理是静态绑定的,没被处理的异常是沿着方法调用栈向上传播,异常处理完毕后程序的执行点转移到异常处理句柄的下一条语句Java与C++不同的是Java具有完善的异常类定义,Java的异常类可分为三大类:Error、一般异常及RuntimeException.当类动态连接失败或产生其它硬件错误时,虚拟机产生Error异常,一般的Java程序不会产生该异常,也不必对该类异常进行处理;RuntimeException类的异常是虚拟机在运行时产生的,如算术运算异常、数组索引异常、引用异常等.由于该类异常在程序中普遍存在,因此用户没必要对它们进行检测、处理,编译程序在编译时也不会去检查该类异常,这些异常由虚拟机在运行时检测并对其进行处理;通常用户程序需要产生并提供异常处理句柄的异常为一般异常,一般异常与Errors不同,它不是严重的系统异常,也不是在程序中普遍存在的,因此在编译时编译器就会提示用户提供异常处理句柄,否则编译不会通过,如I/O异常.编译程序为含有异常处理语句的方法生成一异常处理表,该表指明了异常处理语句产生异常的字节码范围、异常处理句柄的地址以及产生的异常类型.虚拟机是Java语言异常处理机制的微观实现,当虚拟机产生异常或程序执行时由字节码指令athrow产生异常时,异常处理程序都会根据所产生的异常类型及产生异常的当前程序点,在方法异常表中查找对应的异常处理句柄,方法异常表给出了某一程序段代码所产生的异常类型及其对应的异常处理句柄,若查到对应的异常处理句柄则执行该句柄,执行完毕后返回异常处理句柄的下一条语句,若没找到,则异常沿方法调用栈向上传播,将产生的异常传播给该方法的调用者.3COSIX虚拟机异常处理的设计与实现实现异常处理一般可采用3种方法:(1)动态建立异常处理语句的数据结构链表;(2)使用静态的异常处理表,运行时查找该表,以搜寻异常处理句柄;(3)使用有两个返回值的函数.C++[2]和Ada[3]的异常处理使用了第1种方法,第2种方法较第1种可显著提高异常处理的效率,它在C++[4]及Java语言中得到了应用.在该方式下,编译器为每一方法提供异常处理表,由于有了异常处理表,就没有必要再为每一异常处理语句建立数据链表.当异常产生时,异常处理程序可直接查询异常表,快速定位异常处理句柄,若没找到,则将异常传播给上层方法,在它的异常查询表中继续查询.第3种方法在某些Java虚拟机的及时编译设计时被采用[5].该处理形式虽然简单,但是编译过程较为复杂.由于方法间没有共享方法异常表,而使编译后的代码冗长,该方法适用于异常发生频繁的程序.我们在设计国产开放系统平台COSA/COSIX虚拟机的异常处理程序时采用了第2种方法.下面我们对其进行讨论.3.1解释执行时的异常处理解释器的异常