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

根据 JVM 规范(第 4.1 章“类文件结构”),声明“常量池表的索引从 1 到常量池计数 - 1”。

我很好奇为什么他们要跳过 [0] 以及这个条目是用来做什么的。


ibeautiful
浏览 110回答 2
2回答

互换的青春

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

慕田峪4524236

没有保留条目。“[I]indexed from 1”表示常量池中的第一个条目对应于索引 1,因此没有任何 constant_pool[0]。相反,有一个保留索引0,可以确定它不是常量池中的有效索引。该保留索引的记录用途似乎很少见,但至少第 4.7.24 节指定了一种用途:方法参数的名称由常量池中的索引表示,对于未命名的参数,该索引为 0。另请注意,该名称constant_pool_count具有误导性。constant_pool_count - 1规范明确指出常量池中只有条目(请参阅第 4.1 节顶部的结构声明,并与其他一些成员进行比较)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java