提高你的Java代码质量吧:小心switch带来的空值异常
一、分析
使用枚举定义常量时,会有伴有大量的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代码]小心switch带来的空值异常
使用枚举定义常量时,会伴有大量的switch语句判断,目的是伪类每个枚举项解释其行为,例如: public class Client { public static void main(String[ ...
- 提高你的Java代码质量吧:少用静态导入
一.分析 从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导 ...
- 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式
一.分析 字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...
- 提高你的Java代码质量吧:如果有必要,使用变长数组吧
一.分析 Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景 比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...
- 提高你的Java代码质量吧:使用valueof前必须进行校验
一.分析 每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode.name.valueOf等,其中valueOf方法会把一个String类型的名称转变成枚 ...
- 提高你的Java代码质量吧:不要让类型默默转换
一.分析 在Java运算中的类型转换,是先运算在进行类型转换的.具体场景如下. 二.场景 在如下程序中: public class Client{ public static final int ...
- 提高你的Java代码质量吧:谨慎包装类型的比较
一.分析 基本类型可以比较大小,其所对应的包装类型都实现了Comparable接口此问题. 二.场景 代码如下: public class Client{ public static void m ...
- 提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择
一.分析 对于一个字符串进行拼接有三种方法:加号.concat方法.及StringBuiler或StringBuffer. 1."+"方法拼接字符串 str += " ...
- 提高你的Java代码质量吧:使用构造函数协助描述枚举项
一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性. 二.场景 比如,可以通过枚举构造函数声明业务值,定 ...
随机推荐
- JAVA wait(), notify(),sleep具体解释
在CSDN开了博客后,一直也没在上面公布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程相互排斥.同步的时候 ...
- CSS减肥的工具–Firefox插件 CSS Usage
首先,我们需要安装Firefox(猛击此处下载),或者确定你已经安装的版本已经高于3.1; 第二步,安装前端开发人员最普及的开发工具 Firebug: 第三步,安装CSS Usage 0.3.4.1: ...
- jquery在火狐浏览中上传图片并显示
由于火狐浏览器有很多代码无法兼容,特别是图片的显示,下面我介绍一种是我亲自测试过可以实现的方法 <script> function setImagePreview() { //var ix ...
- C++中的条件传送代码
条件传送代码-这种代码先计算一个条件操作的两种结果,然后再条件从而选其中一个-条件传送代码匹配了现代处理器的性能特征(因为现代处理器是流水线) void minmax2(int a[],int b[] ...
- (转) ROS NAMING AND NAMESPACES
原文地址:http://nootrix.com/2013/08/ros-namespaces/ In this tutorial, we will be talking about ROS nam ...
- hadoop官网介绍及如何下载hadoop(2.4)各个版本与查看hadoop API介绍
1.如何访问hadoop官网?2.如何下载hadoop各个版本?3.如何查看hadoop API? 很多同学开发都没有二手资料,原因很简单觉得不会英语,但是其实作为软件行业,多多少少大家会英语的,但是 ...
- hdu1443(约瑟夫环游戏的原理 用链表过的)
Problem Description The Joseph's problem is notoriously known. For those who are not familiar with t ...
- jquery find()和filter()的区别
在写js查找当前标签下某一子元素的子元素集合时,用到了此方法 $(".flyout-trigger").mouseover(function(){ var maxnum=$(thi ...
- python笔记之调用系统命令
python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...
- django--的第一个项目hello world
第一步: 用django-admin命令开始一个项目 cd /tmp/ django-admin startproject firstproject tree /tmp/firstproject 第二 ...