`
zhang_xzhi_xjtu
  • 浏览: 545421 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构12_不要乱用异常

 
阅读更多
code review的时候,发现了如下代码。

	/**
	 * 验证一个字符串是一个长度为10,且内容都是数字。
	 * */
	public static boolean validate(String str) {
		if (str == null || str.length() != 10) {
			return false;
		}

		// 纯数字
		try {
			Long.valueOf(str);
		} catch (NumberFormatException ex) {
			return false;
		}

		return true;
	}

第一反应是异常这么用,好奇怪。异常不应该这么用的啊,也许是为了图省事吧。
但是还是应该把异常用在异常情况下,而不是这么误用。这个用法和用异常判断文件的结束没有什么太大的区别。

仔细看了看,不仅仅是异常用的比较奇怪,这个方法是有漏洞的。
明明方法接口的约定是判断长度和数字,但是因为是用Long的valueOf方法,通过异常来实现,结果像"-100000000"这样本来不合法的字符串可以通过这个校验了。

重构后代码如下,直白的完成该方法的接口约定。

	/**
	 * 验证一个字符串是一个长度为10,且内容都是数字。
	 * */
	public static boolean validate2(String str) {
		if (str == null || str.length() != 10) {
			return false;
		}

		char[] data = new char[str.length()];

		str.getChars(0, str.length(), data, 0);

		for (int i = 0; i < data.length; i++) {
			char c = data[i];
			if (c < '0' || c > '9') {
				return false;
			}
		}

		return true;
	}

分享到:
评论
4 楼 gdpglc 2010-12-30  
zhang_xzhi_xjtu 写道
Durian 写道

通过抛异常,判断数字方法是可取的。
这是一种投机取巧用法,让系统去完成解析的任务,真的挺好的。


投机取巧。
这么说用异常判断文件结尾也可以了。
方法实现和约定不符合也可以了。


如果,某个异常是含意明确的,做为判断的依据并没有问题。只是大多数情况下,都有更好用的办法,所以不用。如果需要,就象你举的例子,没有理由不允许这样用。

你改出来的代码,明显可读性,复杂程度,都比原来的差!

如果,真的不能容忍用异常做判断,可以用正则,好过自已写代码...
3 楼 zhang_xzhi_xjtu 2010-12-30  
Durian 写道

通过抛异常,判断数字方法是可取的。
这是一种投机取巧用法,让系统去完成解析的任务,真的挺好的。


投机取巧。
这么说用异常判断文件结尾也可以了。
方法实现和约定不符合也可以了。
2 楼 Durian 2010-12-30  

通过抛异常,判断数字方法是可取的。
这是一种投机取巧用法,让系统去完成解析的任务,真的挺好的。
1 楼 zhang_xzhi_xjtu 2010-12-30  
超级潜水员 写道
重构出来的代码跟坨屎一样.

?????????

相关推荐

    21点游戏

    【描述】:“用.net写的21点游戏,第一次写,边写边改,代码比较乱~请大家不要见怪~”这句描述揭示了开发者在学习过程中所遇到的常见问题:初次尝试新项目时,往往伴随着不断的试错与修改。尽管代码可能不够整洁,但...

    Tab浏览器(c#)

    这个项目是用C#编程语言实现的,可能是一个个人学习或实验项目,因为开发者提到“代码没整理,很乱”,这暗示了代码可能没有经过严格的优化和重构,是初学者在学习C#时的作品。 【标签】: 1. **浏览器**:这里的...

    jsp+bootstrap+servlet问答类网站.

    7. **错误处理与日志记录**:项目中可能包含错误处理机制,如异常捕获和处理,以及使用日志框架如Log4j或SLF4J记录应用程序的日志信息,便于调试和问题排查。 由于项目描述中提到的“没怎么整理”,可能需要对代码...

    J2MESMS收发短信源代码

    6. **错误处理**:在实际应用中,开发者需要考虑各种异常情况,如网络中断、用户取消操作、无可用SIM卡等,并提供适当的错误处理机制。 7. **安全与权限**:在Android平台上,发送和接收短信可能需要申请相应的权限...

    计算器源码

    在软件开发中,源码是程序员用编程语言编写的原始代码,它是计算机程序的基础,通过编译和链接可以生成可执行文件。在这个案例中,开发者使用VC作为集成开发环境(IDE)编写了这个计算器的源代码。 【描述】:“VC...

    C#编写的简易的音乐播放器可供学习

    - 描述中提到代码可能比较乱,良好的编程习惯包括合理命名、代码注释、遵循一定的编码规范,以及使用设计模式。 - 学习重构技巧,如提取方法、类,以及遵循SOLID原则,有助于提高代码可读性和可维护性。 9. **...

Global site tag (gtag.js) - Google Analytics