读书人

实践中的重构12_不要乱用错误

发布时间: 2012-12-26 14:39:28 作者: rapoo

实践中的重构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;}


---------------------------
看到你的回复,我想起一句话:中国很多程序员是认认真真的制造垃圾代码。

用道德来讨论代码唉!

effective java 里 前边还说 工厂方法比构造方法如何如何好,你是不是把所有的构造都换成工厂方法了呢?

软件最有意思的地方就是,教条不起作用,且害处很大,问题都得具体情况具体分析,每个问题,都要考虑前因后果。书上的一名话就方之四海皆准了...



24 楼 xibaiben 2010-12-30 使用正则表达式是不是会抛出异常?

读书人网 >编程

热点推荐