1700446079
1700446080
break;
1700446081
1700446082
default:
1700446083
1700446084
System.out.println(“输入错误!”);
1700446085
1700446086
break;
1700446087
1700446088
}
1700446089
1700446090
}
1700446091
1700446092
上面的代码中输入了一个Season类型的枚举,然后使用switch进行匹配,目的是输出每个季节能进行的活动。现在的问题是:这段代码有没有问题?
1700446093
1700446094
我们先来看它是如何被调用的,因为要传递进来的是Season类型,也就是一个实例对象,那当然应该允许为空了,我们就传递一个null值进去看看有没有问题,代码如下:
1700446095
1700446096
public static void main(String[]args){
1700446097
1700446098
doSports(null);
1700446099
1700446100
}
1700446101
1700446102
似乎会打印出“输出错误!”,因为在switch中没有匹配到指定值,所以会打印出default的代码块,是这样的吗?不是,运行后的输出如下所示:
1700446103
1700446104
Exception in thread”main”java.lang.NullPointerException
1700446105
1700446106
at Client.doSports(Client.java:9)
1700446107
1700446108
at Client.main(Client.java:5)
1700446109
1700446110
竟然是空指针异常,第9行也就是switch那一行,怎么会有空指针呢?这就与枚举和switch的特性有关了,此问题也是在开发中经常发生的。我们知道,目前Java中的switch语句只能判断byte、short、char、int类型(JDK 7已经允许使用String类型),这是Java编译器的限制。问题是为什么枚举类型也可以跟在switch后面呢?
1700446111
1700446112
很简单,因为编译时,编译器判断出switch语句后的参数是枚举类型,然后就会根据枚举的排序值继续匹配,也就是说上面的代码与以下代码相同:
1700446113
1700446114
public static void doSports(Season season){
1700446115
1700446116
switch(season.ordinal()){
1700446117
1700446118
case Season.Spring.ordinal():
1700446119
1700446120
……
1700446121
1700446122
case Season.Summer.ordinal():
1700446123
1700446124
……
1700446125
1700446126
}
1700446127
1700446128
}
[
上一页 ]
[ :1.700446079e+09 ]
[
下一页 ]