2

在 Java 字节码中,有一个选项可以将常量池索引 0 指定为异常处理程序类型,从而允许您捕获所有异常。但是,据我了解,这与捕获 Throwable 完全相同。那么这个功能的目的是什么?有一天,Java 的设计者是否设想过添加不继承自 Throwable 的异常类型?看起来不像,但除了懒惰,我想不出其他解释。

4

1 回答 1

0

JVM 规范(§4.7.3)指出:

如果该项的值catch_type为零,则为所有异常调用此异常处理程序。这用于实现finally(§3.13)。

尽管第 3.13 节中没有具体讨论 catch_type zero 的使用,但finally在 Java 中编译子句时使用它的提示提供了一个线索。JVM 设计者可能想要一种简单的方法来引用所有异常类型,而不必专门引用Throwable该类。使用 catch_type 零对于 JVM 来说更容易识别,而不是必须索引到常量池并在java/lang/Throwable那里解析类名。

实际上,正如您所说,catch_type 零或指向常量池的索引java/lang/Throwable应该相同地工作。

于 2012-07-21T04:49:50.073 回答