美文网首页java进阶干货
写了5年Java代码,我还是不小心掉进了这些bug

写了5年Java代码,我还是不小心掉进了这些bug

作者: 美团Java | 来源:发表于2019-07-19 00:58 被阅读169次
    公众号二维码不能忘!!!

    第一个坑

    Set<Integer> set = new HashSet<>();
    for (int i = 0; i < 100; i++) {
        set.add(i);
        set.remove(i-1);
    }
    
    System.out.println(set.size());
    

    结果是什么?

    现在换一个

    Set<Short> set = new HashSet<>();
    for (short i = 0; i < 100; i++) {
        set.add(i);
        set.remove(i-1);
    }
    System.out.println(set.size());
    

    这次,它又会输出什么?
    如果不能确定的话,手动运行一下。

    第二个坑

    Object i = 1 == 1 ? new Integer(3) : new Float(1);
    System.out.println(i);
    

    它输出什么?如果没有猜对,我希望你可以去自己找答案

    第三个坑

    这个是在写功能时实际碰到的,看似风平浪静,结果一运行,甩你一个异常。

    // id, name
    Map<Long, String> map = new HashMap<>();
    map.put(1L, "1111");
    map.put(2L, "2222");
    map.put(3L, "3333");
    
    // 后面需要调用的一个方法入参是long[] 类型,
    // map.keySet()可以拿到id的列表,toArray方法可以转化数组
    // ArrayUtils.toPrimitive方法可以把对象数据转化为基本类型数组
    // 然后,我就这样写了
    long[] ids = ArrayUtils.toPrimitive((Long[])map.keySet().toArray());
    

    自以为写的没问题,结果一运行,抛了个异常

    Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Long;
    

    其实这种抛异常还好,至少告诉你错了,最怕那种,运行之后默默返回了不符合预期的结果

    最后,看到方法注释,为了得到Long[],需要这样。

    long[] ids = ArrayUtils.toPrimitive(map.keySet().toArray(new Long[0]));
    

    相关文章

      网友评论

        本文标题:写了5年Java代码,我还是不小心掉进了这些bug

        本文链接:https://www.haomeiwen.com/subject/uqwuhctx.html