《Java虚拟机规范》-初始化方法特殊的特殊命名和异常

本文介绍了Java中构造函数的实现原理,包括初始化方法的特殊命名及其调用机制,并详细探讨了Java虚拟机如何处理异常,包括同步异常、异步异常的产生及处理流程。

1. 初始化方法的特殊命名

在 Java 虚拟机层面上,Java 语言中的构造函数在《Java 语言规范 (第三版)》(下文简称JLS3,§8.8)是以一个名为的特殊实例初始化方法的形式出现的,这个方法名 称是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。

实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令来调用,只有在实例正在构造的时候,实例初始化方法才可以被调用访问(JLS3,§6.6)。 一个类或者接口最多可以包含不超过一个类或接口的初始化方法,类或者接口就是通过这个方 法完成初始化的(§5.5)。这个方法是一个不包含参数的静态方法,名为 ① 。这个名字也是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。

类或接口的初始化方法由 Java 虚拟机自身隐式调用,没有任何虚拟机字节码指令可以调用这个方法,只有在类的初始化阶段中会被虚拟机自身调用。

2. 异常

Java虚拟机的异常使用Throwable或其子类的实例来表示。

抛异常的本质,实际是程序控制权的一种即时的、非局部的转换--从抛异常的地方转换至处理异常的地方。

同步异常:当前线程执行的某个操作导致的

异步异常:程序的其他任意地方进行的动作而导致的异常

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 虚拟机执行时都能有一致的行为表现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值