【问题标题】:How is multi-catch implemented in Java 7?Java 7 中的 multi-catch 是如何实现的?
【发布时间】:2012-04-24 15:36:45
【问题描述】:

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

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

【问题讨论】:

标签: java jvm try-catch java-7


【解决方案1】:

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

  • 尝试代码运行正常
  • 每个 catch 块都被编译为一个单独的方法
  • 有一个异常表可以将执行流重定向到正确的catch块

当使用多 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

【讨论】:

    【解决方案2】:

    异常表的工作方式类似于一种对所有异常类(异常表中的条目)进行迭代的开关,并检查抛出的异常是否实现了它,从而决定在字节码中跳转的位置。

    http://www.artima.com/underthehood/exceptions.html

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

    (免责声明:我不是字节码方面的专家,多年没有接触过,所以可能会遗漏一些东西)

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 2013-04-25
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多