java - 为什么 Eclipse Java 编译器检查 null 类型转换?

标签 java eclipse compiler-construction null bytecode

考虑以下 Java 片段:

public class Test {
    public static void use(Object[] x) {
    }

    public static void main(String[] args) {
        Object[] x = null;

        use(x);
    }
}

Eclipse 3.7 编译器为 main() 生成的 Java 字节码如下所示:

public static void main(java.lang.String[]);
  Code:
   0:   aconst_null
   1:   checkcast   #20; //class "[Ljava/lang/Object;"
   4:   astore_1
   5:   aload_1
   6:   invokestatic    #21; //Method use:([Ljava/lang/Object;)V
   9:   return

相反,这是 OpenJDK 1.6.0b22 编译器生成的字节码:

public static void main(java.lang.String[]);
  Code:
   0:   aconst_null
   1:   astore_1
   2:   aload_1
   3:   invokestatic    #2; //Method use:([Ljava/lang/Object;)V
   6:   return

请注意,Eclipse 编译器会发出额外的 checkcast 操作码。它似乎也只对数组执行此操作,而不对任何其他变量类型执行此操作。

我的问题:

  1. 据我所知,null 可以分配给任何类,包括数组。 checkcast 一个已知的 null 值是否有意义?

  2. 额外的checkcast会影响性能吗?

  3. 这是否可以被视为 Eclipse Java 编译器中的错误?

注意:

我可以部分回答(2),至少就 OpenJDK 1.6.0b22 JVM 而言。我执行了一个简单的基准测试,在定时紧密循环中对 null 进行了多次赋值。我无法检测到任何一致的性能差异,无论是哪种方式。

也就是说,我的基准测试非常简单,任何半点优化器都可能使其毫无用处,因此它可能并不代表现实世界的应用程序。我希望 JVM 总是优化该 checkcast 操作码,但情况可能并非如此。

最佳答案

关于你的第一个问题,你是对的,那里的 checkcast 指令是多余的。 根据Sun's Java Hotspot wiki空检查和实例检查很便宜。

我打开了一个 issue in Eclipse Bugzilla从 Eclipse 编译器团队获得反馈,但正如之前指出的,这是多余的,但无害的检查。它仅影响字节码大小,Java HotSpot 编译器可能会在运行时应用类型检查优化。

更新:from Eclipse compiler team这似乎是 another old bug 的副作用.

关于java - 为什么 Eclipse Java 编译器检查 null 类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586872/

相关文章:

java - fragment 事务出错(空对象引用)

c++ - 编译器的提示以帮助其完成优化任务

php - PHP的编译时错误插件

java - String.Split - 意外行为

java - xmlbeans - 设置复杂类型的内容

eclipse - 无法识别Scala解析包

Eclipse错误: 'Failed to create the Java Virtual Machine'

c - BISON AST 生产打印乱序值

Java Swing递归布局

Java import jgoodies.forms.factories.* 无法解析。 ( eclipse 月神)