
本文介绍如何通过循环和状态变量实现车速的累加式控制:用户输入“more”时速度递增5 mph,“less”时递减5 mph,且数值持续累积,而非重复赋值。
本文介绍如何通过循环和状态变量实现车速的累加式控制:用户输入“more”时速度递增5 mph,“less”时递减5 mph,且数值持续累积,而非重复赋值。
要实现“每输入一次 more 就在当前速度基础上增加 5 MPH”的功能,关键在于维护一个跨多次输入的状态变量(如 speed),并在循环中持续更新它——而不是每次重新初始化、或错误地操作循环索引(如 i += 5)来模拟速度变化。
下面是一个简洁、健壮且符合 Java 最佳实践的实现:
public static void readInputSpeed(String prompt) {
Scanner sc = new Scanner(System.in); // ✅ Scanner 实例应在循环外创建,避免资源泄漏
int speed = 0; // ✅ 状态变量:保存当前累计速度(单位:MPH)
String input = "";
while (!input.equalsIgnoreCase("quit")) { // ✅ 使用 equalsIgnoreCase() 安全比对字符串
System.out.print(prompt);
input = sc.nextLine().trim(); // ✅ .trim() 防止空格干扰判断
if (input.equalsIgnoreCase("more")) {
speed += 5;
} else if (input.equalsIgnoreCase("less")) {
speed -= 5;
} else if (!input.equalsIgnoreCase("quit")) {
System.out.println("Unknown command. Use 'more', 'less', or 'quit'.");
continue; // 忽略无效输入,不更新速度也不打印
}
if (input.equalsIgnoreCase("more") || input.equalsIgnoreCase("less")) {
System.out.println(speed + " MPH"); // ✅ 仅在有效操作后输出当前速度
}
}
sc.close(); // ✅ 显式关闭 Scanner,释放系统资源
}
? 核心要点说明:
- 状态持久化:int speed = 0 在循环外声明,确保每次迭代都能读取并更新上一次的结果;
- 字符串比较安全:必须使用 .equalsIgnoreCase() 或 .equals(),绝不可用 ==(后者比较引用而非内容);
- Scanner 管理:在循环内反复新建 Scanner(System.in) 会导致资源竞争与潜在异常,应复用单个实例;
- 边界处理:加入 trim() 去除首尾空格,避免 "more " 被误判为无效命令;
- 用户体验优化:对非法输入给出提示,并跳过速度输出,避免混淆;
- 资源清理:循环结束后调用 sc.close(),防止输入流泄露(尤其在长期运行程序中至关重要)。
? 扩展建议(可选):
- 可将 speed 提升为 Car 类的实例字段(如 private int currentSpeed),使逻辑更面向对象;
- 增加速度上下限(如 0 ≤ speed ≤ 200),防止负速或超速:
speed = Math.max(0, Math.min(200, speed + 5)); // 加速时上限200,减速时下限0
该方案简洁高效,完全满足“输入 more → 累加 5 MPH”的核心需求,同时具备健壮性与可维护性,适合嵌入车辆控制、教学演示或交互式命令行应用中。










