读书人

提高你的Java代码质量吧:小心switch带

发布时间: 2013-09-07 14:12:45 作者: rapoo

提高你的Java代码质量吧:小心switch带来的空值异常

一、分析

使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为。

我们知道,目前的Java的switch语句只能判断byte、short、char、int类型(JDK7已经允许使用string类型),为什么枚举也能跟在switch后面呢?很简单,因为编译的时候,编译器判断出switch后面的参数是枚举类型,然后就会根据枚举的排序值继续匹配。如下:

看明白了吧,switch语句先计算season变量的排序值,然后与枚举常量的每个排序值进行对比。

二、场景

看这样一个例子:

这段代码有没有问题?我们先来看看如何被调用的,因为传递的是Season类型,也就是一个实例(枚举的本质就是类)对象,那就当然允许为null了,我们就传递一个null进去看看,代码如下:

似乎应该打印,“输入错误!",因为在switch中没有匹配,输出default代码块。然而,我们看看真实结果:

Exception in thread "main" java.lang.NullPointerException

at Client.doSports(Client.java:9)

at Client.main(Client.java:5)

怎么会是空指针异常呢?这就与枚举和switch的特性有关了,此问题也在开发中经常发生的。根据上面分析,如果season为null,无法执行ordinal方法,于是报空指针异常了。

三、建议

问题清楚了,建议在switch语句枚举前加入参数是否为null。

读书人网 >编程

热点推荐