提高你的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 


新技术,新未来!欢迎大家关注 “1024工场”微信服务号 ,时刻关注我们的最新的技术讯息! (甭客气!尽情的扫描或者长按!)

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值