使用枚举定义常量时。会伴有大量switch语句判断,目的是为了每个枚举项解释其行为,例如这样一个方法:

上面的代码传入了一个Season类型的枚举,然后使用switch进行匹配,目的是输出每个季节的活动,现在的问题是这段代码又没有问题:
我们先来看看它是如何被调用的,因为要传递进来的是Season类型,也就是一个实例对象,那当然允许为空了,我们就传递一个null值进去看看代码又没有问题,如下:

似乎会打印出“输出错误”,因为switch中没有匹配到指定值,所以会打印出defaut的代码块,是这样的吗?不是,运行后的结果如下:

竟然是空指针异常,也就是switch的那一行,怎么会有空指针呢?这就与枚举和switch的特性有关了,此问题也是在开发中经常发生的。我们知道,目前Java中的switch语句只能判断byte、short、char、int类型(JDk7允许使用String类型),这是Java编译器的限制。问题是为什么枚举类型也可以跟在switch后面呢?
因为编译时,编译器判断出switch语句后跟的参数是枚举类型,然后就会根据枚举的排序值继续匹配,也就是或上面的代码与以下代码相同:

看明白了吧,switch语句是先计算season变量的排序值,然后与枚举常量的每个排序值进行对比,在我们的例子中season是null,无法执行ordinal()方法,于是就报空指针异常了。问题清楚了,解决很简单,在doSports方法中判断输入参数是否为null即可。