如何在Java7中实现多捕获?

如何在Java7中实现多捕获?,java,jvm,try-catch,java-7,Java,Jvm,Try Catch,Java 7,Java 7编译器如何处理多捕获块?一个简单的实现是生成字节码,就像存在多个catch块一样。然而,我从多个来源收集到的信息表明情况并非如此——处理多个异常类型的catch块在编译期间不会产生重复的字节码 那么,它是如何工作的呢?是否有一条新的字节码指令告诉JVM有关多捕获块的信息?异常表的工作原理类似于一种开关,它迭代所有异常类(异常表中的条目),并检查抛出的异常是否实现了它,从而决定在字节码中跳转到哪里 根据这一点,您只需在异常表中创建一个新条目,我不明白为什么两个条目不能直接指向相同的p

Java 7编译器如何处理多捕获块?一个简单的实现是生成字节码,就像存在多个catch块一样。然而,我从多个来源收集到的信息表明情况并非如此——处理多个异常类型的catch块在编译期间不会产生重复的字节码


那么,它是如何工作的呢?是否有一条新的字节码指令告诉JVM有关多捕获块的信息?

异常表的工作原理类似于一种开关,它迭代所有异常类(异常表中的条目),并检查抛出的异常是否实现了它,从而决定在字节码中跳转到哪里

根据这一点,您只需在异常表中创建一个新条目,我不明白为什么两个条目不能直接指向相同的pc偏移量

(免责声明:我不是字节码专家,多年没有接触过字节码,因此可能会遗漏一些内容)

基于,例外情况汇编如下(总结):

  • try代码正常运行
  • 每个catch块被编译为一个单独的方法
  • 有一个异常表可以将执行流重定向到右catch块
使用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