switch的后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句似乎没有任何作用了,程序已经列举出了所有的可能选项,肯定不会执行到default语句,.

错了...这个default还是很有用的,以我们定义的日志级别来举例说明,这是一个典型的枚举常量.如下所示:

 public class Client {
public static void main(String[] args) {
LogLevel logLevel = LogLevel.INFO;
switch (logLevel) {
case DEBUG:
System.out.println("****Debug Log*****");
break;
case INFO:
System.out.println("****Info Log*****");
break;
case WARN:
System.out.println("****Warn Log*****");
break;
case ERROR:
System.out.println("****Error Log*****");
break;
}
}
} enum LogLevel {
DEBUG, INFO, WARN, ERROR;
}

把所有的枚举项都列举完了,不可能有其他值,所以就不需要default代码块了,这是普遍认识,但问题是我们的switch代码块与枚举之前没有强制约束关系,也就说两者只是在语义上建立了联系,并没有一个强制约束,比如LogLevel枚举发生改变,增加了一个枚举项FATAL,如果此时我们对switch不做任何的修改,编译虽然不会出现问题,但是运行期会发生非预期的错误:FATAL类型的日志没有输出.

为了避免这类的非预期的错误,建议在default后直接抛出一个AssertionError错误,其含义就是"不要跑到这里来,一跑到这里就会出问题",这样一来很容易查找到错误,方便立刻排除.

当然也有其他方法可以解决此问题,比如修改IDE工具,以Eclipse为例,可以把Java--->Complier---->Errors/Warnings中的"Enum type constant not covered on switch"设置为Error级别,如果不判断所有的枚举项就不能通过编译.

最新文章

  1. POJ 1979 Red and Black
  2. 基于DevExpress的Winform程序安装包的制作
  3. 最简单的jsp+servlet的增删改查代码
  4. 远程线程DLL注入64位进程
  5. Unity3D 面试题汇总
  6. vmware 10 e1000e e1000e_cyclecounter_read 挂机解法
  7. Codeforces Round #215 (Div. 2) A. Sereja and Coat Rack
  8. 简单实用的双向电平转换电路(3.3v-5v)
  9. MongoEngine简易教程(转)
  10. 提示“正尝试安装的adobe flash player不是最新版本”的解决方法
  11. A*算法详解 BZOJ 1085骑士精神
  12. 轻量级应用开发之(06)Autolayout自动布局1
  13. linux 文件权限除了r、w、x外还有s、t、i、a权限:
  14. 远程mysql服务器无法连接解决方案
  15. CheckBoxList 获取与设置选中的值
  16. java_jdbc_可滚动结果集与分页
  17. WordPress Ultimate Auction插件跨站请求伪造漏洞
  18. JavaSE学习总结第24天_多线程2
  19. 201521123016 《Java程序设计》第13周学习总结
  20. css文字与排版

热门文章

  1. Java常用命令行工具
  2. [iOS微博项目 - 2.0] - OAuth授权3步
  3. 使用C#读取XML节点,修改XML节点
  4. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分 - 点权剖分 - 单点权修改)
  5. js两种创建对象方式
  6. 大一下C#五子棋大作业
  7. 看京东如何把Intel RealSense技术用在物流上
  8. VS里面如何设置环境默认的开发语言
  9. Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
  10. TreeView1MouseMove