2 回答

TA贡献1797条经验 获得超6个赞
他们跳过索引 0,以便它可以用于您通常引用常量池条目但想要指示“无”的情况。它是相当于空指针的常量池。
索引 0 最显着的用途是用于“捕获所有”异常处理程序。异常处理程序可以指向它要处理的异常类的常量池条目,或者只使用索引 0 来捕获所有内容(这等同于 catching java/lang/Throwable
)。在实践中,编译器将生成捕获所有异常处理程序以实现finally
、synchronized
块和 try 与资源的清理部分,等等。
索引 0 的其他用途包括:
的超类
java/lang/Object
没有名称的参数的名称
不是另一个类成员的类的外部类(即顶级类、本地类和匿名类)
匿名类的内部名称
未立即包含在方法中的类的封闭方法
没有版本信息的模块的版本信息
没有依赖信息的模块的依赖

TA贡献1875条经验 获得超5个赞
没有保留条目。“[I]indexed from 1”表示常量池中的第一个条目对应于索引 1,因此没有任何 constant_pool[0]。相反,有一个保留索引0,可以确定它不是常量池中的有效索引。
该保留索引的记录用途似乎很少见,但至少第 4.7.24 节指定了一种用途:方法参数的名称由常量池中的索引表示,对于未命名的参数,该索引为 0。
另请注意,该名称constant_pool_count
具有误导性。constant_pool_count - 1
规范明确指出常量池中只有条目(请参阅第 4.1 节顶部的结构声明,并与其他一些成员进行比较)。
添加回答
举报