【发布时间】:2010-02-17 10:59:38
【问题描述】:
这个
public class test
{
public static void main(String[] args)
{
Object o = null;
assert o != null;
if(o != null)
System.out.println("o != null");
}
}
打印出 "o != null"; 1.5_22 和 1.6_18。编译器错误?注释掉断言修复它。当断言被禁用时,字节码似乎直接跳转到打印语句:
public static main(String[]) : void
L0
LINENUMBER 5 L0
ACONST_NULL
ASTORE 1
L1
LINENUMBER 6 L1
GETSTATIC test.$assertionsDisabled : boolean
IFNE L2
ALOAD 1: o
IFNONNULL L2
NEW AssertionError
DUP
INVOKESPECIAL AssertionError.<init>() : void
ATHROW
L2
LINENUMBER 8 L2
GETSTATIC System.out : PrintStream
LDC "o != null"
INVOKEVIRTUAL PrintStream.println(String) : void
L3
LINENUMBER 9 L3
RETURN
L4
【问题讨论】:
-
这里不打印任何东西,1.6.0_12
-
你是用哪个版本的javac编译器编译的?它应该是一个编译器错误,使用 1.6.0_18(windows 32 位)编译代码按预期工作(不打印 o!= null)。
-
不可重现。您确定这正是您的测试代码吗?你用的是什么编译器和什么jvm?什么标志?
-
Windows 7 x64 位。将重新测试 x32 ...
-
也许你应该澄清你的问题并提到这发生在 ecj(Java 的 Eclipse 编译器)而不是 Sun 的 javac。顺便说一句,它适用于我的 Galileo(和 Java 6u18)。
标签: java eclipse compiler-construction assert