为了账号安全,请及时绑定邮箱和手机立即绑定

为什么常量池从 1开始索引?为什么保留的 constant_pool[0] 条目?

为什么常量池从 1开始索引?为什么保留的 constant_pool[0] 条目?

ibeautiful 2023-02-23 14:44:23
根据 JVM 规范(第 4.1 章“类文件结构”),声明“常量池表的索引从 1 到常量池计数 - 1”。我很好奇为什么他们要跳过 [0] 以及这个条目是用来做什么的。
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

他们跳过索引 0,以便它可以用于您通常引用常量池条目但想要指示“无”的情况。它是相当于空指针的常量池。

索引 0 最显着的用途是用于“捕获所有”异常处理程序。异常处理程序可以指向它要处理的异常类的常量池条目,或者只使用索引 0 来捕获所有内容(这等同于 catching java/lang/Throwable)。在实践中,编译器将生成捕获所有异常处理程序以实现finallysynchronized块和 try 与资源的清理部分,等等。

索引 0 的其他用途包括:

  • 的超类java/lang/Object

  • 没有名称的参数的名称

  • 不是另一个类成员的类的外部类(即顶级类、本地类和匿名类)

  • 匿名类的内部名称

  • 未立即包含在方法中的类的封闭方法

  • 没有版本信息的模块的版本信息

  • 没有依赖信息的模块的依赖


查看完整回答
反对 回复 2023-02-23
?
慕田峪4524236

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 节顶部的结构声明,并与其他一些成员进行比较)。


查看完整回答
反对 回复 2023-02-23
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信