提高你的Java代码质量吧:小心switch带来的空值异常
来源:互联网 发布:mac隐藏磁盘 编辑:程序博客网 时间:2024/05/21 11:22
一、分析
使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为。
我们知道,目前的Java的switch语句只能判断byte、short、char、int类型(JDK7已经允许使用string类型),为什么枚举也能跟在switch后面呢?很简单,因为编译的时候,编译器判断出switch后面的参数是枚举类型,然后就会根据枚举的排序值继续匹配。如下:
public static void doSports(Season season){ switch(season.ordinal()){ case Season.Spring.ordinal(): …... case Season.Summer.ordinal(): …... } }
看明白了吧,switch语句先计算season变量的排序值,然后与枚举常量的每个排序值进行对比。
二、场景
看这样一个例子:
public static void doSports(Season season){ switch(season){ case Spring: System.out.printf("春天放风筝"); break; case Summer: System.out.println("夏天游泳"); break; case Autum: System.out.println("秋天捉知了"); break; case Winter: System.out.println("冬天滑冰"); break; default: System.out.println("输入错误"); break; } }
这段代码有没有问题?我们先来看看如何被调用的,因为传递的是Season类型,也就是一个实例(枚举的本质就是类)对象,那就当然允许为null了,我们就传递一个null进去看看,代码如下:
public static void main(string[] args){ doSports(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。
- 提高你的Java代码质量吧:小心switch带来的空值异常
- 提高你的Java代码质量吧:提倡异常封装
- 提高你的Java代码质量吧
- 提高你的Java代码质量吧:在switch的default代码块中增加AssertionError错误
- 提高你的Java代码质量吧:危险的边界
- 提高你的Java代码质量吧:提防包装类型的null值
- 提高你的Java代码质量吧:提防包装类型的null值
- 提高你的Java代码质量吧:多种最值算法,适时选择
- java的switch空指针异常
- 如何提高你的代码质量
- 提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择
- 提高你的Java代码质量吧:不同的列表应该选择不同的遍历方法
- 提高你的Java代码质量吧:三元操作符的类型陷阱
- 提高你的Java代码质量吧:不容忽视的四舍五入细节
- 提高你的Java代码质量吧:不容忽视的四舍五入细节
- 提高你的Java代码质量吧:谨慎包装类型的比较
- 提高你的Java代码质量吧:字符拼接位置的玄机
- 提高你的Java代码质量吧:不容忽视的四舍五入细节
- SQL的主键和外键约束
- Android创建和删除桌面快捷方式
- 试译“Time is dangerous”
- Named pipe between Java and Perl
- 人脸识别必读的N篇文章
- 提高你的Java代码质量吧:小心switch带来的空值异常
- spring MVC做form提交Neither BindingResult nor plain target object for bean name 'command' available
- 【Serialization】Xml Serialize Helper
- Robotium自动化测试:Test run failed to complete. Expected 1 tests, received 0
- 创业与亲力亲为-素老胡huxingyu
- 大众点评校招助理产品经理-笔试题分析(上)
- 癌症治愈(分享)
- 大众点评校招助理产品经理-笔试题分析(下)
- HDOJ 3315 - My Brute 维护两个最值..构图最大费用最大流 or KM模板