Java 7 编译器如何处理多捕获块?一个简单的实现是生成字节码,就好像存在多个 catch 块一样。但是,我从多个来源收集到情况并非如此 -处理多种异常类型的 catch 块在编译期间不会产生重复的字节码。
那么它是怎样工作的 ?是否有新的字节码指令告诉 JVM 多捕获块?
基于Java Virtual Machine Specification,异常编译如下(总结):
当使用 multi catch 子句时,catch 块是相同的(仅出现一次),但异常表将包含一个具有相同 from、to 和 target 值的条目。
例如,这段代码:
public static void main(String args[]) throws InterruptedException {
try {
System.out.println("why not?");
} catch (IllegalArgumentException e) {
System.out.println("here");
} catch (IllegalStateException | ArithmeticException e) {
System.out.println("there");
}
}
生成以下异常表(在我的机器上):
from to target type
0 8 11 Class java/lang/IllegalArgumentException
0 8 23 Class java/lang/IllegalStateException
0 8 23 Class java/lang/ArithmeticException
异常表的工作方式类似于一种对所有异常类(异常表中的条目)进行迭代的开关,并检查抛出的异常是否实现了它,从而决定在字节码中跳转的位置。
http://www.artima.com/underthehood/exceptions.html
据此,您只需要在异常表中创建一个新条目,我不明白为什么两个条目不能只指向相同的 pc 偏移量。
(免责声明:我不是字节码方面的专家,多年没有接触过,所以可能会遗漏一些东西)