
本文详解如何使用 scanner 正确读取多组汽车品牌与型号,存入 arraylist,并在循环结束后统一输出全部车辆信息及总数,避免输入阻塞和重复打印问题。
本文详解如何使用 scanner 正确读取多组汽车品牌与型号,存入 arraylist,并在循环结束后统一输出全部车辆信息及总数,避免输入阻塞和重复打印问题。
在 Java 中,使用 ArrayList 存储用户输入的汽车数据(如品牌和型号)是一个常见需求,但初学者常因对 Scanner 输入机制理解不足而陷入逻辑陷阱。原代码中使用 scan.hasNext() 判断输入结束,会导致程序无限等待后续输入——因为该方法仅检测“是否有下一个 token”,而非“是否已到达输入末尾”;尤其在标准输入(如键盘输入)场景下,它不会因换行或空行自动返回 false,从而造成死锁。
✅ 正确的输入控制逻辑:用空行终止输入
推荐采用“空行作为输入结束标志”的健壮策略。每次读取 make 后立即判断是否为空;若为空则终止循环,否则继续读取 model,再判断其是否为空(可选,但增强容错性)。关键改进如下:
Scanner scan = new Scanner(System.in);
List<car> cars = new ArrayList();
String make, model;
while (true) {
make = scan.nextLine().trim();
if (make.isEmpty()) break; // 空行退出
model = scan.nextLine().trim();
if (model.isEmpty()) break; // 模型为空也退出(可选)
cars.add(new Car(make, model));
}
scan.close();</car>
⚠️ 注意:nextLine() 必须配合 trim() 使用,以消除用户误输入空格导致的逻辑偏差。
✅ 优化 Car 类:支持构造初始化与简洁输出
为提升可读性与封装性,建议为 Car 类添加带参构造器,并重写 toString() 方法,使 System.out.println(car) 直接输出 "Honda Fit" 格式:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
public class Car {
private final String make;
private final String model;
public Car(String make, String model) {
this.make = make;
this.model = model;
}
// getter 方法保持不变(略)
@Override
public String toString() {
return make + " " + model;
}
}
? 使用 final 字段可确保对象不可变,提升线程安全与语义清晰度(非必须但推荐)。
✅ 输出逻辑修正:避免重复计数与格式错乱
原代码在 for 循环内多次调用 System.out.format("There are %s cars \n", cars.size());,导致每辆车都打印一次总数(如输出 3 次“3 cars”)。正确做法是——先完整遍历输出所有车辆,再单独一行打印总数:
// 正确输出顺序
for (Car car : cars) {
System.out.println(car); // 自动调用 toString()
}
System.out.printf("There are %d cars%n", cars.size());
System.out.println(); // 单独换行(无需 format("%s", "\n"))
✅ 完整可运行示例
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
List<car> cars = new ArrayList();
String make, model;
while (true) {
make = scan.nextLine().trim();
if (make.isEmpty()) break;
model = scan.nextLine().trim();
if (model.isEmpty()) break;
cars.add(new Car(make, model));
}
scan.close();
for (Car car : cars) {
System.out.println(car);
}
System.out.printf("There are %d cars%n", cars.size());
System.out.println();
}
}</car>
输入示例(每行一个值,空行结束):
Honda Fit Toyota Corolla Mazda Axela
预期输出:
Honda Fit Toyota Corolla Mazda Axela There are 3 cars
✅ 总结:核心在于——
① 用 nextLine().trim() + 空字符串判断替代 hasNext();
② 输入与存储逻辑解耦(先读、再判、后存);
③ 输出分两阶段:逐项打印 → 统一输出总数;
④ 借助 toString() 简化打印逻辑,提升代码可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










