`

犯下这种错误,羞愧难当!

阅读更多
   我很早就过了SJCP,可是在实际项目中居然还是犯下了一个让我羞愧难当的错误,而且这些错误还产生了致使的影响,真是杯具啊!大家给我扔块西瓜皮吧,我得凉快下~~~

错误1:长整数赋值问题

   系统有一个功能要产生邀请码,客户通过邀请码进行注册,但是邀请码要有过期时间,希望60天后过期,过期时间采用毫秒数:
   long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000;

   可是,测试人员告诉我,邀请码10天不到就过期了,我看了代码,百思不解,最后跟踪了代码,才发现
引用
60 * 24 * 60 * 60 * 1000
并不会自动转化为long,则是一个int,10天的毫秒数就超过了int的最大值,因此10天不到就过期了!
   这儿犯下的错误是对整数字面值赋值时,默认为int型这个基础Java知识的忽视造成的.如果要让字面数字当成long,则必须在字面数字后显示加L标识,即:
   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基础并时刻牢记啊!! 
分享到:
评论
4 楼 shihengli2010 2018-01-16  
liu4626846 写道
java解惑有很多这样的问题

顶 java解惑这些都有
3 楼 liu4626846 2012-08-20  
java解惑有很多这样的问题
2 楼 wf_chn 2012-07-11  
看过了,记住了,又忘了。。。。。非要自己做了才能印象深刻
1 楼 静候雨 2012-03-28  
这个要顶啊!!

其实第二点你肯定经过考虑,但是只是对代码优化进行了考虑,并没看到其中的bug。
第一点,太隐含了,JVM没报错,很难发现啊!哈哈!

相关推荐

Global site tag (gtag.js) - Google Analytics