本文介绍一种简洁可靠的方式,通过维护一个持续更新的速度变量,在用户反复输入“more”或“less”时实现速度的累加/递减(如5→10→15 mph),避免重复赋值或状态丢失。
本文介绍一种简洁可靠的方式,通过维护一个持续更新的速度变量,在用户反复输入“more”或“less”时实现速度的累加/递减(如5→10→15 mph),避免重复赋值或状态丢失。
要实现“每输入一次 more 就在当前速度基础上增加 5 MPH”的交互逻辑,关键在于状态持久化——即速度值必须在多次输入之间被保留,而非每次调用函数时重置。原始代码中存在多个典型问题:Scanner 在循环内反复创建导致资源浪费;使用 == 比较字符串引发逻辑错误;局部变量未跨迭代保存;数组和嵌套循环设计冗余且未正确使用。
以下是优化后的完整实现:
public static void readInputSpeed(String prompt) {
Scanner sc = new Scanner(System.in); // ✅ Scanner 实例复用,提升效率与稳定性
int speed = 0; // ✅ 状态变量:在循环外声明,生命周期覆盖整个交互过程
String input = "";
while (!input.equalsIgnoreCase("quit")) { // ✅ 使用 equalsIgnoreCase() 安全比对,支持 "MORE"、"More" 等大小写变体
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("⚠️ 无效指令:请输入 'more'、'less' 或 'quit'");
continue; // 跳过无效输入后的输出,保持界面清晰
}
if (!input.equalsIgnoreCase("quit")) {
System.out.println(speed + " MPH"); // ✅ 仅对有效操作反馈当前速度
}
}
System.out.println("✅ 速度控制已退出,最终速度:" + speed + " MPH");
sc.close(); // ✅ 显式关闭 Scanner,避免资源泄漏(尤其在长期运行程序中)
}
核心要点说明:
- 状态管理:speed 变量定义在 while 循环外部,确保每次循环迭代都能读取并更新上一次的结果;
- 字符串比较安全:始终使用 equalsIgnoreCase() 替代 ==(后者比较引用而非内容);
- 输入健壮性:.trim() 消除首尾空格,else if 分支过滤非法输入,并提供友好提示;
- 资源规范:Scanner 单例复用 + 最终 close(),符合 Java I/O 最佳实践;
- 用户体验:退出时输出总结信息,便于调试与确认最终状态。
该方案无需数组、无需嵌套循环、不依赖外部类字段(如 Car.speed() 的静态状态),结构清晰、可读性强,可直接集成到车辆模拟、教学演示或命令行工具中。










