使用枚举定义常量时,会伴有大量的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带来的空值异常相关推荐

  1. switch监听android代码,Android switch当代码setCheck时,不调用onCheckedChanged

    最近做项目需要使用switch控件去设置手势密码,当手动打开或者关闭switch控件时,会跳转到设置手势密码页面,并且设置成功后,会保存switch状态到文件中.每次进入手势密码页面,都去获取swit ...

  2. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...

  3. 读-秦小波-编写高质量代码:改善java程序的151个建议

    有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适. 不要在常量和变量中出现易混淆的字母 包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰: 字母l ...

  4. 【读书笔记】改善Java程序的151个建议

    目录 1.三元操作符的类型必须一致 2.避免带有变长参数的方法的重载.别让null威胁到变长方法 3.重写变长方法也要循规蹈矩 4.警惕自增的陷阱 5.养成良好的习惯,显式声明UID 6.避免用序列化 ...

  5. java 代码解析工具_改善 Java 代码质量的工具与方法

    原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...

  6. java用switch语句算,Java的switch语句与条件运算符

    文章导读 [前面学习了条件结构的if语句,可以解决多条件判断的情况.除了if语句外,Java语言还提供了switch语句和条件运算符用于简化条件判断语句的编写.本篇探讨Java的switch语句和条件 ...

  7. 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)

    第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...

  8. [改善Java代码]避开基本类型数组转换列表陷阱

    开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...

  9. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

最新文章

  1. 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例
  2. java nginx 例子_Nginx配置日志
  3. .net 批量更新_Revit二次开发——读取CAD文字实现更新模型的思路
  4. IIC软件模拟-读写EEPROM
  5. OpenCV Viz 3D虚拟空间模块
  6. 矩阵求导法则,梯度求导方式
  7. html的单元格加线,html表格单元格添加斜下框线的方法
  8. HDOJ-2154-跳舞毯
  9. 全息投影图片合成-(matlab)(将4个视角图合成为一张)
  10. “真功夫”与“花拳绣腿”
  11. python语言下,B站(bilibili)热门排行榜视频封面爬取程序V1.0 小白也能看懂,八十岁没牙老太太看完拿舌头都能爬封面!!
  12. 怎么开启linux的dhcp,怎么开启DHCP服务器啊
  13. 再次慨叹生命的脆弱,我辈当惜之
  14. 一文万字带你入门智能路由器OpenWrt系统,并在虚拟中安装配置OpenWrt
  15. 长安链源码学习v2.2.1--ioc机制(十)
  16. Hi3516A开发--视频接口
  17. Mysql预编译动态拼接表名查询
  18. HTML+JavaScript随机名单抽取
  19. 计算机软件作文800字,电脑程序选择不走的表作文800字 关于电脑程序选择不走的表的作文800字...
  20. cf服务器维护会不会掉分,《cf》枪王排位长时间不打会不会掉分? 枪王排位扣分机制介绍...

热门文章

  1. Qt Designer信号和槽
  2. Linux培训之系统升级
  3. More about Tair (NoSql)
  4. Linux平台Oracle安装脚本
  5. Go 语言——Tensorflow
  6. 多线程(十、AQS原理-ReentrantLock公平锁)
  7. 阿里云ET工业大脑发布AI视觉产品“见远”:电池片、车辆、路面都能被“诊断”...
  8. PS怎么将自己的形状存储为自定形状?
  9. debian var目录
  10. MySQL数据表的创建、查看、插入