15. break万万不可忘
我们经常会写一些转换类,例如货币转换、日期转换、编码转换等,在金融领域里用到最多的要数中文数字转换了,看下面代码:
public String toChineseNumberCase(int n){
String chineseNumber = "";
switch(n){
case 0:chineseNumber = "零";
case 1:chineseNumber = "壹";
case 2:chineseNumber = "贰";
case 3:chineseNumber = "叁";
case 4:chineseNumber = "肆";
case 5:chineseNumber = "伍";
case 6:chineseNumber = "陆";
case 7:chineseNumber = "柒";
case 8:chineseNumber = "捌";
case 9:chineseNumber = "玖";
}
return chineseNumber;
}
这里有问题吗?有,每个case少了break关键字。导致输入的n在0-9之间时返回值都是“玖“。
为什么会是这样的结果相信大家都知道,就是因为switch-case少了break关键字的化,程序会继续执行,直到找到最近的break语句结束,但可惜没有。
这里讲这个简单的问题的原因在于:
虽然此类问题发生得非常频繁,但也很容易发现,只要做一下单元测试(Unit Test),问题立刻就会被发现并解决掉,但如果是在一堆的case语句中,其中一条漏掉了break关键字,特别是在单元测试覆盖率不够高的时候(项目质量与项目工期息息相关的,而项目工期往往不是由项目人员决定的,所以如果一个项目的单元测试覆盖率能够达到60%,你就可以笑了),也就是说分支条件可能覆盖不到的时候,那就会在生产中出现大事故。
对于此类问题,还有一个最简单粗暴的解决办法:
修改IDE的警告级别,例如在Eclipse中,可以依次点击 Performances -> Java -> Compiler -> Errors/Warnings -> Potential Programming problems,然后修改'switch' case fall-through为Errors级别,如果你胆敢不在case语句中加入break,那Eclipse直接就报个红叉给你看,这样就可以完全避免该问题的发生了。