如何在Java 7中实现多捕获?
Java 7编译器如何处理多捕获块? 一个简单的实现是生成字节码,就好像存在多个catch块一样。 但是,我从多个来源收集到的情况并非如此 – 处理多个exception类型的catch块在编译期间不会产生重复的字节码。
那么它是怎样工作的 ? 是否有新的字节码指令告诉JVM多捕获块?
基于Java虚拟机规范 ,exception编译如下(总结):
- 尝试代码正常运行
- 每个catch块都被编译为好像它是一个单独的方法
- 有一个exception表将执行流重定向到右catch块
使用multi catch子句时,catch块是相同的(仅出现一次),但exception表将包含一个具有相同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"); } }
生成以下exception表(在我的机器上):
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
exception表就像一种迭代迭代所有exception类(exception表中的条目)并检查抛出的exception是否实现它,从而决定在字节码中跳转的位置。
http://www.artima.com/underthehood/exceptions.html
根据这个,你只需要在exception表中创建一个新条目,我不明白为什么两个条目不能指向同一个pc偏移量。
(免责声明:我不是字节码方面的专家,多年来没有碰过一个,所以可能会错过一些东西)
- 如何基于实体接口声明存储库?
- 如何使用DaoAuthenticationProvider以编程方式使用Spring Security对用户进行身份validation
- Java Security&BouncyCastle API让人感到困惑和困惑
- 需要将标头添加到将发送到IBM MQ websphere的消息
- switch语句可以有多个变量吗?
- 在Hadoop伪分布式模式下充分利用所有核心
- JSE 1.8,Sandbox Java Applet通过HTTPS加载,但是使用HTTP检索了crossdomain.xml
- -Djava.library.path中的多个目录
- ant的mkdir失败了。 我该如何处理这个错误