考慮下面的Java代碼:爲什麼Eclipse Java編譯器檢查從null轉換?
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
操作碼。它似乎也只是爲數組而不是其他變量類型。
我的問題:
據我所知,
null
是分配給任何類,包括數組。是否任何感到checkcast
已知null
價值?是否額外
checkcast
影響性能?難道這被認爲是Eclipse Java編譯器中的一個錯誤嗎?
注:
我可以部分答案(2),至少只要在OpenJDK 1.6.0b22 JVM而言。我執行了一個簡單的基準測試,並在定時緊密循環中對null
進行了幾項分配。這種或那種方式我無法檢測到任何一致的性能差異。
這就是說,我的基準是非常簡單,任何半體面的優化器將有可能使它無用的,所以它可能無法代表現實世界的應用程序。我希望JVM會總是優化了那個checkcast
操作碼,但可能並非如此。
+1的錯誤報告和一個有趣的閱讀... – thkala