锁定老帖子 主题:竟然犯下这种低级错误,羞愧难当啊!!!
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-28
最后修改:2012-03-28
错误1:长整数赋值问题 系统有一个功能要产生邀请码,客户通过邀请码进行注册,但是邀请码要有过期时间,希望60天后过期,过期时间采用毫秒数: long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000; 可是,测试人员告诉我,邀请码10天不到就过期了,我看了代码,百思不解,最后跟踪了代码,才发现 引用 60 * 24 * 60 * 60 * 1000 并不会自动转化为long,而是一个int,10天的毫秒数就超过了int的最大值了,因此10天不到就过期了!
这儿犯下的错误是其实对 “整数字面值赋值时默认为int型”这个基础Java知识的忽视造成的.如果要让JVM将字面数字当成long,则必须在字面数字后显示加L标识,所以这个BUG是这样解决的: long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000L; 错误2:数值越界的问题 我写的一个模块允许开发者注册插件,为了控制插件执行的先后顺序,因此我写了一个Orderable接口,插件实现该接口以决定执行的先后顺序(orderNo越小越先执行): public interface Orderable { /** * 排序号,越小越在前面 */ int getOrdreNo(); } 然后写了一个Comparator,以便可以通过java.util.Collections的 sort(List<T> list,Comparator<? super T> c) 对插件List进行排序。Comparator是这样写的: public class OrderableComparator implements Comparator { private static OrderableComparator intance = new OrderableComparator(); private OrderableComparator() { } public int compare(Object obj1, Object obj2) { int order1 = Integer.MAX_VALUE; int order2 = Integer.MAX_VALUE; if (obj1 instanceof Orderable) { order1 = ((Orderable) obj1).getOrdreNo(); } if (obj2 instanceof Orderable) { order2 = ((Orderable) obj2).getOrdreNo(); } return order1 - order2;//① 大家注意这儿是出鬼的地方!!! } public static OrderableComparator getIntance() { return intance; } } 但是一个兄弟咆哮地告诉我,它的插件的getOrderNo()已经设置为Integer.MIN_VALUE,但是却在最后一位执行!!! 跟踪了代码,才发现是对数值越界问题的忽视而造成了这个低级错误,下面具体分析一下,如Plugin1的getOrdreNo()为Integer.MIN_VALUE,而Plugin2的getOrdreNo()为1,可是大家想想下面的计算值是多少呢? Integer.MIN_VALUE - 1 是2147483647!! 找到问题后改起来是不费工夫的: public int compare(Object obj1, Object obj2) { int order1 = Integer.MAX_VALUE; int order2 = Integer.MAX_VALUE; if (obj1 instanceof Orderable) { order1 = ((Orderable) obj1).getOrdreNo(); } if (obj2 instanceof Orderable) { order2 = ((Orderable) obj2).getOrdreNo(); } if(order1 > order2){ return 1; }else if(order1 < order2){ return -1; }else{ return 0; } } 唉,这两个CASE居然是最近几天连接发生了,真是百年成之不足,一旦败之有余啊。看来要恶补一下Java基础并时刻牢记啊!! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-28
case1 俺也遇到过很多次 哈哈哈哈,而且 以前也有人发过 看来都是神人 都是凡人
|
|
返回顶楼 | |
发表时间:2012-03-28
没有UT估计这样的问题还会继续。
|
|
返回顶楼 | |
发表时间:2012-03-28
呵呵 估计会犯这种错误的人在50%以上哦。
|
|
返回顶楼 | |
发表时间:2012-03-28
呵呵 是大意失荆州吧
|
|
返回顶楼 | |
发表时间:2012-03-28
今天晚上参加了一个电话面试,面试官很轻松地出了几个问题把我打败了。
我也决定先放下研究杂七杂八技术的想法,还是先从操作系统、Java底层开始牢牢抓起。 细节决定成败啊。深有体会。。 |
|
返回顶楼 | |
发表时间:2012-03-28
第一条犯过,第二条没有遇到过,感谢!
|
|
返回顶楼 | |
发表时间:2012-03-29
唉,就在最近还犯过第一条的错误... ...
|
|
返回顶楼 | |
发表时间:2012-03-29
最后修改:2012-03-29
晕,在groovy里用了1,不知道会不会有错。
Java里,也用过,但没注意过居然是个错误。 |
|
返回顶楼 | |
发表时间:2012-03-29
很典型,赞!
|
|
返回顶楼 | |