Java汽车信息ArrayList程序语句顺序错误排查求助
问题分析与修复方案
核心错误:输出顺序颠倒且重复打印总数
你的代码将打印车辆总数的语句放在了遍历车辆的for循环内部,导致每输出一辆车就重复打印一次总数,且输出顺序是先车辆信息、后总数,完全不符合先输出总数、再依次输出车辆列表的要求。
其他潜在问题
- Car类构造函数逻辑无效:构造函数里
this.make = make;属于无效自赋值,未完成初始化(虽然后续set方法能覆盖,但写法不规范)。 - 输入处理逻辑漏洞:当前代码会先把未赋值的Car对象加入列表,再读取型号,若此时输入
-1退出,列表会混入无效的空Car对象。 - 输入判断不匹配:
scan.hasNext()配合scan.nextLine()容易出现换行符残留问题,更适合用scan.hasNextLine()匹配行输入场景。
修复后的代码
Main类修复版
import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); List<Car> cars = new ArrayList<>(); while (scan.hasNextLine()) { String make = scan.nextLine(); if ("-1".equals(make)) break; String model = scan.nextLine(); if ("-1".equals(model)) break; // 先完成属性赋值,再将有效对象加入列表 Car car = new Car(); car.setMake(make); car.setModel(model); cars.add(car); } scan.close(); // 先打印总数,再遍历输出车辆信息 System.out.format("There are %d cars%n", cars.size()); for (Car car : cars) { System.out.println(car.getMake() + " " + car.getModel()); } } }
Car类修复版
public class Car { private String make; private String model; // 空构造函数移除无效赋值 public Car() {} // 可选:增加带参构造函数,简化对象创建 public Car(String make, String model) { this.make = make; this.model = model; } public String getMake() { return make; } public void setMake(String make) { this.make = make; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } }
修复说明
- 调整输出逻辑:将打印总数的语句移至
for循环外部,且放在车辆列表输出之前,保证输出顺序符合需求。 - 优化输入流程:先读取完整的品牌和型号,确认有效后再创建并赋值Car对象,避免无效对象进入列表。
- 修正构造函数:移除无效自赋值代码,可选增加带参构造函数提升代码简洁性。
- 匹配输入场景:用
scan.hasNextLine()替代scan.hasNext(),更适配逐行输入的场景。
内容的提问来源于stack exchange,提问作者Margarita Kattsyna
相关产品推荐
相关产品推荐

