java - Java 7 中的 multi-catch 是如何实现的?

标签 java jvm try-catch java-7

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

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

最佳答案

基于Java Virtual Machine Specification ,异常编译如下(总结):

  • try代码运行正常
  • 每个 catch block 都被编译成一个单独的方法
  • 有一个异常表将执行流重定向到正确的 catch block

当使用多 catch 子句时,catch block 是相同的(只出现一次),但异常表将包含一个具有相同 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

关于java - Java 7 中的 multi-catch 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301244/

相关文章:

java - Kotlin/Java-如何识别内部软件包?

android - 使用 kotlin 协程时使用 try catch block 吞下异常

c++ - 一个宏可以在不同的地方捕获一组异常吗?

java HashMap containsKey 尽管键存在但返回 false

java - 无法从服务器应用程序使用 ssl 连接 mongodb

jvm - sun.management.ThreadImpl#findDeadlockedThreads0 的 OpenJDK 实现在哪里

java - 有没有办法知道哪些对象在堆的 "old"区域

java - 为什么不能在 try 和 catch block 之间插入代码?

c# - 将 for 循环与 if 和 else 结合使用

java - 无法通过 bundle 将字符串从一个 fragment 发送到另一个 fragment