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/