在switch的default代码块中增加AssertionError错误

简介:

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

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

复制代码
 1 public class Client {
 2     public static void main(String[] args) {
 3         LogLevel logLevel = LogLevel.INFO;
 4         switch (logLevel) {
 5         case DEBUG:
 6             System.out.println("****Debug Log*****");
 7             break;
 8         case INFO:
 9             System.out.println("****Info Log*****");
10             break;
11         case WARN:
12             System.out.println("****Warn Log*****");
13             break;
14         case ERROR:
15             System.out.println("****Error Log*****");
16             break;
17         }
18     }
19 }
20 
21 enum LogLevel {
22     DEBUG, INFO, WARN, ERROR;
23 }
复制代码

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

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

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


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5632770.html,如需转载请自行联系原作者

相关文章
|
5月前
|
API Android开发 开发者
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
35 5
|
5月前
|
编译器 C语言
learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)
learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)
|
前端开发
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
974 0
|
SQL 并行计算 数据库连接
ArcSWAT报错:Error Number :-2147467259; 对 COM 组件的调用返回了错误 HRESULT E_FAIL
ArcSWAT报错:Error Number :-2147467259; 对 COM 组件的调用返回了错误 HRESULT E_FAIL
JavaScrip代码讲解break与continue的区别
基本break语句和continue语句都是在循环语句中使用的。break与continue用来控制循环流程。
|
Java
switch case 语句有如下规则
switch case 语句有如下规则
172 0
|
C语言
分支与循环语句(if…else , switch...case , default)
分支与循环语句(if…else , switch...case , default)
124 0
分支与循环语句(if…else , switch...case , default)
|
JavaScript 前端开发
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
212 0
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
为什么阿里强制我们switch块必须要有default语句
为什么阿里强制我们switch块必须要有default语句
537 0
为什么阿里强制我们switch块必须要有default语句