这是一个错误。下面是根据 Java 语言规范第 3 版为语句指定的行为:switch
SwitchStatement:
switch ( Expression ) SwitchBlock
执行语句时,首先计算 。如果计算结果为 ,则抛出 a,并且由于这个原因,整个语句突然完成。switch
Expression
Expression
null
NullPointerException
switch
显然,Eclipse中的错误与大小写无关,或者根本没有关系。default
enum
public class SwitchingOnAnull {
public static void main(String[] args) {
java.math.RoundingMode x = null;
switch(x) {};
switch((Integer) null) {};
switch((Character) null) {
default: System.out.println("I've got sunshine!");
}
}
}
上面的代码在Eclipse(至少是某些版本)上编译并“良好”运行。每个人都会在编译时抛出一个,这与规范的要求完全一致。switch
NullPointerException
javac
原因
以下是在 Eclipse 下编译时:javap -c SwitchingOnAnull
Compiled from "SwitchingOnAnull.java"
public class SwitchingOnAnull extends java.lang.Object{
public SwitchingOnAnull();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
5: ldc #22; //String I've got sunshine!
7: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
}
Eclipse 编译器似乎完全摆脱了整个构造。不幸的是,这种优化违反了语言规范。switch
官方说法
该错误已归档并分配以进行修复。
奥利维尔·托曼 2010-05-28 08:37:21 EDT
我们在优化方面过于激进。
为:
switch((Integer) null) {};
当我们至少应该计算表达式时,我们优化整个语句。switch
我来看看。
3.6.1 的候选项。
另请参见