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
java switch null_[改善Java代码]小心switch带来的空值异常相关推荐
- switch监听android代码,Android switch当代码setCheck时,不调用onCheckedChanged
最近做项目需要使用switch控件去设置手势密码,当手动打开或者关闭switch控件时,会跳转到设置手势密码页面,并且设置成功后,会保存switch状态到文件中.每次进入手势密码页面,都去获取swit ...
- Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议
代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...
- 读-秦小波-编写高质量代码:改善java程序的151个建议
有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适. 不要在常量和变量中出现易混淆的字母 包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰: 字母l ...
- 【读书笔记】改善Java程序的151个建议
目录 1.三元操作符的类型必须一致 2.避免带有变长参数的方法的重载.别让null威胁到变长方法 3.重写变长方法也要循规蹈矩 4.警惕自增的陷阱 5.养成良好的习惯,显式声明UID 6.避免用序列化 ...
- java 代码解析工具_改善 Java 代码质量的工具与方法
原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...
- java用switch语句算,Java的switch语句与条件运算符
文章导读 [前面学习了条件结构的if语句,可以解决多条件判断的情况.除了if语句外,Java语言还提供了switch语句和条件运算符用于简化条件判断语句的编写.本篇探讨Java的switch语句和条件 ...
- 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)
第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...
- [改善Java代码]避开基本类型数组转换列表陷阱
开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...
- java 151建议_编写高质量代码改善java程序的151个建议——导航开篇
前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...
最新文章
- 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例
- java nginx 例子_Nginx配置日志
- .net 批量更新_Revit二次开发——读取CAD文字实现更新模型的思路
- IIC软件模拟-读写EEPROM
- OpenCV Viz 3D虚拟空间模块
- 矩阵求导法则,梯度求导方式
- html的单元格加线,html表格单元格添加斜下框线的方法
- HDOJ-2154-跳舞毯
- 全息投影图片合成-(matlab)(将4个视角图合成为一张)
- “真功夫”与“花拳绣腿”
- python语言下,B站(bilibili)热门排行榜视频封面爬取程序V1.0 小白也能看懂,八十岁没牙老太太看完拿舌头都能爬封面!!
- 怎么开启linux的dhcp,怎么开启DHCP服务器啊
- 再次慨叹生命的脆弱,我辈当惜之
- 一文万字带你入门智能路由器OpenWrt系统,并在虚拟中安装配置OpenWrt
- 长安链源码学习v2.2.1--ioc机制(十)
- Hi3516A开发--视频接口
- Mysql预编译动态拼接表名查询
- HTML+JavaScript随机名单抽取
- 计算机软件作文800字,电脑程序选择不走的表作文800字 关于电脑程序选择不走的表的作文800字...
- cf服务器维护会不会掉分,《cf》枪王排位长时间不打会不会掉分? 枪王排位扣分机制介绍...