我刚刚阅读了Java bytecode instruction listings并想知道:

Java字节码中的ifneifnonnull有什么区别?

我知道,在高级语言(例如Java)中,0值是一个具有某些运算(例如加,减,乘)的数值,可以与其他数值进行比较,而null则表示“无值” 。

我猜我有一个问题是我不知道null如何在字节码/程序集中表示。

最佳答案

JVM规范对此也许更为清晰。
因此,对于 ifne (and ifeq etc),限制为:
ifeq指令是类型安全的,前提是可以有效地将与int匹配的类型从传入操作数堆栈中弹出,从而产生传出类型状态NextStackFrame,而指令Target的操作数是一个有效的分支目标,假设传入的状态为NextStackFrame。

ifnonnull 的限制是:

ifnonnull指令是类型安全的,前提是可以有效地将匹配类型的引用从传入操作数堆栈中弹出,从而产生传出类型状态NextStackFrame,并且该指令的操作数Target是假定NextStackFrame传入类型状态的有效分支目标。

基本上ifeqifne用于整数值,而ifnonnull用于参考值。
要比较两个引用是否相等,请改为使用 if_acmpeq ifnonnull实际上是其中只有一个操作数的一种特殊情况,因为它总是与null进行比较。
关于null引用在数据中的表示方式,JVM规范explicitly allows this to be implementation-specific:

引用值也可以是特殊的空引用,即无对象的引用,此处将以空表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。
Java虚拟机规范没有规定编码为null的具体值。

10-06 04:47