如何在Java 7中实现多捕获?

Dee*_*pak 11 java jvm try-catch java-7

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

那么它是怎样工作的 ?是否有新的字节码指令告诉JVM多捕获块?

ass*_*ias 15

基于Java虚拟机规范,异常编译如下(总结):

  • 尝试代码正常运行
  • 每个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");
    }
}
Run Code Online (Sandbox Code Playgroud)

生成以下异常表(在我的机器上):

   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
Run Code Online (Sandbox Code Playgroud)