我刚刚阅读了Java bytecode instruction listings并想知道:
Java字节码中的ifne
和ifnonnull
有什么区别?
我知道,在高级语言(例如Java)中,0
值是一个具有某些运算(例如加,减,乘)的数值,可以与其他数值进行比较,而null
则表示“无值” 。
我猜我有一个问题是我不知道null
如何在字节码/程序集中表示。
最佳答案
JVM规范对此也许更为清晰。
因此,对于 ifne
(and ifeq
etc),限制为:ifeq
指令是类型安全的,前提是可以有效地将与int匹配的类型从传入操作数堆栈中弹出,从而产生传出类型状态NextStackFrame,而指令Target的操作数是一个有效的分支目标,假设传入的状态为NextStackFrame。
而 ifnonnull
的限制是:
ifnonnull指令是类型安全的,前提是可以有效地将匹配类型的引用从传入操作数堆栈中弹出,从而产生传出类型状态NextStackFrame,并且该指令的操作数Target是假定NextStackFrame传入类型状态的有效分支目标。
基本上ifeq
和ifne
用于整数值,而ifnonnull
用于参考值。
要比较两个引用是否相等,请改为使用 if_acmpeq
。 ifnonnull
实际上是其中只有一个操作数的一种特殊情况,因为它总是与null进行比较。
关于null
引用在数据中的表示方式,JVM规范explicitly allows this to be implementation-specific:
引用值也可以是特殊的空引用,即无对象的引用,此处将以空表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。
Java虚拟机规范没有规定编码为null的具体值。