这是一个错误。这是
switch根据 Java语言规范,第三版 的声明的指定行为:[JLS 14.11
switch声明](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11)
SwitchStatement: switch ( expression ) SwitchBlockswitch执行该语句时,首先对expression进行评估。如果结果expression为null,NullPointerException则抛出a
,并且由于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
原因
这是
javap -c SwitchingOnAnull在Eclipse下编译时的:
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: returnpublic 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;)V10: return}
看来Eclipse编译器
switch完全摆脱了整个构造。不幸的是,这种优化违反了语言规范。
官方话
该错误已归档并已分配修复。
也可以看看奥利维尔·托曼(Olivier Thomann)2010-05-28 08:37:21
我们在优化上过于激进。
对于:
switch((Integer) null) {};我们
switch至少应该评估表达式时才能优化整个语句。我会看一看。
3.6.1的候选人。
- 错误314830-打开
null
表达式并不总是抛出NullPointerException
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)