Java中的一些经典bug

本文探讨了在Java编程中遇到的两个常见错误:尝试向Arrays.asList()创建的固定大小列表添加元素以及在迭代器遍历过程中修改列表。解释了问题产生的原因,即Arrays.asList()返回的列表不支持修改操作,并提供了相应的解决方法,即使用ArrayList转换列表。同时,展示了在迭代器遍历列表时,如何避免修改导致的异常,通过在添加元素后立即跳出循环来确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//增加货物
public static void addGoods() {
    System.out.println("您选择的是添加商品功能");
    System.out.println("请输入商品编号:");
    int goodsNum = sc.nextInt();
    System.out.println("请输入商品单价:");
    double goodsPri = sc.nextDouble();
    System.out.println("请输入商品名称:");
    String goodsName = sc.next();
    if (gl.add(new Goods(goodsNum, goodsPri, goodsName))) {
        System.out.println("添加成功!");
    }
}


//货物service
public class GoodsService {
//初始化货物
    public static List initGoods(){
        Goods g1 = new Goods(10.0, "笔记本");
        Goods g2 = new Goods(2.0, "西红柿");
        Goods g3 = new Goods(5.0, "辣条");

        //存入数组中
        Goods[] goods = {g1,g2,g3};

        //对象数组转为集合
        List<Goods> gl = Arrays.asList(goods);
        return gl;
    }
}

在这里插入图片描述
原因解读及解决办法:
调用Arrays.asList()生产的List的add、remove方法时报异常,这是由于Arrays.asList() 返回的是Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重写了这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。解决方法如下:

//初始化货物
public static List initGoods(){
    Goods g1 = new Goods(10.0, "笔记本");
    Goods g2 = new Goods(2.0, "西红柿");
    Goods g3 = new Goods(5.0, "辣条");

    //存入数组中
    Goods[] goods = {g1,g2,g3};

    //对象数组转为集合
    List<Goods> al = new ArrayList(Arrays.asList(goods));

    return al;
}

相当于Arrays.asList(goods)出来的集合是一个固定大小的箱子,如果需要添加,删除等操作,需要将其装入新的集合(大箱子)中

bug2

public class Hello01 {
public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("张三");
        list.add("李四");
        Iterator it = list.iterator();
        for (Object o : list) {
            if(o.equals("张三")){
                list.add("王五");
            }
        }
        System.out.println(list);
    }
}

在这里插入图片描述
解读及解决方案:在list.add(“王五”);下一行加break;跳出

public class Hello01 {
public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("张三");
        list.add("李四");
        Iterator it = list.iterator();
        for (Object o : list) {
            if(o.equals("张三")){
                list.add("王五");
                break;
            }
        }
        System.out.println(list);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值