java switch null_[改善Java代码]小心switch带来的空值异常

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

1 public classClient {2 public static voidmain(String[] args) {3

4 doSports(null);5 }6

7 public static voiddoSports(Season season) {8 switch(season) {9 caseSpring:10 System.out.println("春天放风筝");11 break;12 caseSummer:13 System.out.println("夏天游泳");14 break;15 caseAutumn:16 System.out.println("秋天捉知了");17 break;18 caseWinter:19 System.out.println("冬天滑冰");20 break;21 default:22 System.out.println("输入错误!");23 break;24 }25 }26 }27

28 enumSeason {29 Spring, Summer, Autumn, Winter;30 }

上面的代码输入 了一个Season类型的枚举,然后使用switch进行匹配,目的是输出每个季节的活动.但是代码是否有问题?

doSports(null),似乎会打印出"输出错误",因为在switch中没有匹配到指定的值,所以会打印出default的代码块.

运行看结果:

Exception in thread "main"java.lang.NullPointerException

at cn.summerchill.test.Client.doSports(Client.java:12)

at cn.summerchill.test.Client.main(Client.java:8)

switch那一行报出了空指针...这就是枚举和switch的特性有关了...此问题也是在开发中经常发生.

目前Java中的switch语句只能判断byte,short,char,int类型(JDK7中已经允许使用String类型),这是Java编译器的限制,问题是为什么枚举类型也可以 跟在switch后面呢?

因为编译时,编译器判断出switch语句后面的参数是枚举类型,然后就根据枚举的排序值继续匹配,也就是说上面代码与以下代码相同:

public classClient {public static voidmain(String[] args) {

doSports(Season.Spring);

}public static voiddoSports(Season season) {switch(season.ordinal()) {caseSeason.Spring.ordinal():

System.out.println("春天放风筝");break;caseSeason.Summer.ordinal():

System.out.println("夏天游泳");break;caseSeason.Autumn.ordinal():

System.out.println("秋天捉知了");break;caseSeason.Winter.ordinal():

System.out.println("冬天滑冰");break;default:

System.out.println("输入错误!");break;

}

}

}enumSeason {

Spring, Summer, Autumn, Winter;

}

但是这样会报错的...在各个case语句上 报 case expressions must be constant expressions..但是书中却没有提到这一点....不知道为什么.....

switch语句是先计算season变量的排序值,然后与枚举常量的每个排序值进行对比.

在我们的例子中season的变量值是null,无法执行ordinal()方法,于是报空指针异常了.

解决方法也有很简单:在doSports()方法中判断输入的参数是否是null即可.

ordinal 单词是序数的意思. ordinal()方法获得的是从0开始的数字 .....Spring对应为0 ,Summer为1,Autumn为2,Winter为3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值