Java中非静态ArrayList添加新元素时覆盖旧数据问题求助
问题根因分析
- 核心问题1:
Order对象的实例化位置错误
你将order = new Order(dateS, status, client);写在了for循环内部,每次循环都会创建一个全新的Order实例,旧的Order实例直接被覆盖丢弃,每个新Order里只会添加当前循环的1个OrderItem,最终你拿到的order变量只保留了最后一次循环生成的实例,自然看起来像之前的元素都被覆盖了。 - 次要问题2:
Order类的total()方法存在两处错误- 累加逻辑写反:
totalp =+ i.subtotal()实际等价于totalp = +i.subtotal(),每次循环都会直接覆盖totalp的值,而非累加 - 初始值设置错误:
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
相关产品推荐
相关产品推荐

