我只是想知道为什么Java7的switch
语句不支持null
case而抛出NullPointerException
?参见下面的注释行(示例取自the Java Tutorials article on switch
):
{
String month = null;
switch (month) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
case "march":
monthNumber = 3;
break;
//case null:
default:
monthNumber = 0;
break;
}
return monthNumber;
}
这将避免在每次使用switch
之前进行null检查的if
条件。
发布于 2013-08-16 10:07:17
一般来说,null
很难处理;也许没有null
也能有更好的语言。
您的问题可能会通过以下方式解决
switch(month==null?"":month)
{
...
//case "":
default:
monthNumber = 0;
}
发布于 2015-04-26 10:45:00
它并不美观,但是String.valueOf()
允许您在开关中使用空字符串。如果找到null
,它会将其转换为"null"
,否则只返回您传递给它的相同字符串。如果您不显式处理"null"
,那么它将转到default
。唯一需要注意的是,无法区分字符串"null"
和实际的null
变量。
String month = null;
switch (String.valueOf(month)) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
case "march":
monthNumber = 3;
break;
case "null":
monthNumber = -1;
break;
default:
monthNumber = 0;
break;
}
return monthNumber;
发布于 2013-08-16 08:22:57
这是一次尝试回答为什么它抛出NullPointerException
下面的javap命令的输出显示,case
是根据switch
参数字符串的哈希码选择的,因此在对空字符串调用.hashCode()
时抛出NPE。
6: invokevirtual #18 // Method java/lang/String.hashCode:()I
9: lookupswitch { // 3
-1826660246: 44
-263893086: 56
103666243: 68
default: 95
}
这意味着,基于对Can Java's hashCode produce same value for different strings?的回答,尽管很少,但仍然存在匹配两种情况的可能性(两个具有相同散列代码的字符串)请参见下面的示例
int monthNumber;
String month = args[0];
switch (month) {
case "Ea":
monthNumber = 1;
break;
case "FB":
monthNumber = 2;
break;
// case null:
default:
monthNumber = 0;
break;
}
System.out.println(monthNumber);
javap,用于
10: lookupswitch { // 1
2236: 28
default: 59
}
28: aload_3
29: ldc #22 // String Ea
31: invokevirtual #24 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
34: ifne 49
37: aload_3
38: ldc #28 // String FB
40: invokevirtual #24 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
43: ifne 54
46: goto 59 //Default
正如您所看到的,只为"Ea"
和"FB"
生成了一个案例,但是有两个if
条件来检查每个案例字符串是否匹配。非常有趣和复杂的方式来实现这个功能!
https://stackoverflow.com/questions/18263489
复制相似问题