《编写高质量代码:改善Java程序的151个建议》 建议15

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直接就报个红叉给你看,这样就可以完全避免该问题的发生了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值