You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中非静态ArrayList添加新元素时覆盖旧数据问题求助

问题根因分析
  • 核心问题1:Order对象的实例化位置错误
    你将order = new Order(dateS, status, client);写在了for循环内部,每次循环都会创建一个全新的Order实例,旧的Order实例直接被覆盖丢弃,每个新Order里只会添加当前循环的1个OrderItem,最终你拿到的order变量只保留了最后一次循环生成的实例,自然看起来像之前的元素都被覆盖了。
  • 次要问题2:Order类的total()方法存在两处错误
    1. 累加逻辑写反:totalp =+ i.subtotal() 实际等价于totalp = +i.subtotal(),每次循环都会直接覆盖totalp的值,而非累加
    2. 初始值设置错误:Double totalp = null; 首次赋值就会触发空指针异常,应该初始化为0.0
修复方案

1. 主程序main方法修复

将Order的实例化逻辑移到for循环外部,修改后代码片段如下:

// 原有代码不变
System.out.println("How many items to this order?");
Integer itemsQuantity = sc.nextInt();
sc.nextLine();
Double price = null;
Integer quantity = null;
String pname = null;
Date dateS = new Date(System.currentTimeMillis()); // 订单创建时间统一放在循环外,取订单生成的时间即可
// 在这里实例化Order,全局只有一个Order实例
Order order = new Order(dateS, status, client);

for(int i=0; i<itemsQuantity; i++) {
    // 原有获取商品名称、价格、数量的逻辑不变
    System.out.printf("Enter #%d item data: ", i+1);
    System.out.println("\nProduct Name: ");
    pname = sc.nextLine();
    System.out.println("Product Price: ");
    price = sc.nextDouble();
    System.out.println("Quantity: ");
    quantity = sc.nextInt();
    if(i>=0) {
        sc.nextLine();
    }
    Product product = new Product(pname, price);
    OrderItem orderItem = new OrderItem(quantity, price, product);
    // 直接往已有的order里加商品,不要再new Order
    order.addItem(orderItem);
}

2. Order类total()方法修复

修改后代码如下:

public Double total() {
    Double totalp = 0.0; // 初始值改为0.0
    for (OrderItem i : items) {
        totalp += i.subtotal(); // 把=+改成+=
    }
    return totalp;
}

内容的提问来源于stack exchange,提问作者Game changer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:30:00