博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[改善Java代码]在switch的default代码块中增加AssertionError错误
阅读量:7069 次
发布时间:2019-06-28

本文共 1215 字,大约阅读时间需要 4 分钟。

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级别,如果不判断所有的枚举项就不能通过编译.

 

转载地址:http://uyhll.baihongyu.com/

你可能感兴趣的文章
Python文件操作(txt\xlsx\csv)及os操作
查看>>
【HDOJ】1297 Children’s Queue
查看>>
【HDOJ】3957 Street Fighter
查看>>
mysql修改库、表、字段 字符集,中文排序
查看>>
C# 不借助第三个变量实现两整数交换
查看>>
Octopus系列之UploadValues异步上载
查看>>
vue props命名最好直接使用kebab-case (短横线隔开式) 命名
查看>>
鼠标hover时区块动画旋转变色的css3样式掩码
查看>>
简单控件
查看>>
Zookeeper+Kafka完全分布式实战部署
查看>>
python中写日志log
查看>>
洛谷P2327 [SCOI2005]扫雷 枚举 搜索
查看>>
实现HTTP文件下载
查看>>
[linux,springboot] - 记一次java项目部署
查看>>
Android笔记之——线程
查看>>
Dedecms channel 标签 指定typeid时 currentstyle无效的修复办法
查看>>
[Go] 并发和并行的区别
查看>>
如何学习python
查看>>
Ta-Lib环境搭建及代码分析
查看>>
.NET Framework 中的设计模式
查看>>