ifne和ifnonnull有什么区别?

时间:2014-03-29 12:47:42

标签: java bytecode

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

Java字节码中ifneifnonnull之间的区别是什么?

我知道在高级语言(例如Java)中,值0是一个具有一些操作(如加法,减法,乘法)的数值,可以与其他数值进行比较,而{{1} }}是一个代表"没有值"。

的值

我想我遇到的一个问题是,我不知道如何在字节码/汇编中表示null

1 个答案:

答案 0 :(得分:3)

JVM规范可能更清楚。

因此对于ifne (and ifeq etc),限制是:

  

ifeq指令是类型安全的,如果一个人可以有效地弹出一个类型匹配int的传入操作数堆栈,产生传出类型状态NextStackFrame,并且指令的操作数Target是一个有效的分支目标,假设一个NextStackFrame的传入类型状态。

ifnonnull限制是:

  

ifnonnull指令是类型安全的,如果一个人可以有效地弹出类型匹配引用关闭传入操作数堆栈,产生传出类型状态NextStackFrame,并且指令的操作数Target是一个有效的分支目标,假设传入类型状态为NextStackFrame。

基本上ifeqifne用于整数值,而ifnonnull用于参考值。

要比较两个引用是否相等,请改用if_acmpeqifnonnull实际上是一个特殊情况,只有一个操作数,因为它总是只与null进行比较。

数据null引用的表示方式而言,JVM规范explicitly allows this to be implementation-specific

  

参考值也可以是特殊的空引用,对无对象的引用,这里将用null表示。 null引用最初没有运行时类型,但可以转换为任何类型。引用类型的默认值为null。

     

Java虚拟机规范没有规定编码null的具体值。