
本文介绍如何通过循环和状态变量实现车速的持续累加(如输入“more”每次+5 mph)或递减(输入“less”每次−5 mph),避免重复赋值,确保速度值在多次输入间持久保留并正确更新。
本文介绍如何通过循环和状态变量实现车速的持续累加(如输入“more”每次+5 mph)或递减(输入“less”每次−5 mph),避免重复赋值,确保速度值在多次输入间持久保留并正确更新。
要实现“每输入一次 'more' 就在当前速度基础上增加 5 MPH”的功能,核心在于两点:状态保持(即保存上一次的速度值)和安全的字符串比较(避免使用 == 比较字符串内容)。原代码中存在多个典型问题:input == "more" 是引用比较而非内容比较;Scanner 在循环内反复创建会导致资源浪费与潜在异常;数组和嵌套 for 循环不仅冗余,还未能真正维护状态。
以下是优化后的完整实现:
public static void readInputSpeed(String prompt) {
Scanner sc = new Scanner(System.in); // ✅ Scanner 实例复用,提升效率与稳定性
int speed = 0; // ✅ 状态变量:全程跟踪当前车速,初始为 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("quit")) {
System.out.println(speed + " MPH"); // ✅ 仅在有效操作后输出当前速度
}
}
System.out.println("Speed control exited. Final speed: " + speed + " MPH");
sc.close(); // ✅ 显式关闭 Scanner,释放系统资源
}
关键改进说明:
- 状态持久化:int speed 定义在 while 外部,生命周期覆盖整个交互过程,天然支持累加/递减;
- 健壮的字符串匹配:全部使用 equalsIgnoreCase(),兼容 "MORE"、"More"、"more "(配合 .trim())等常见输入变体;
- 清晰的控制流:对非法命令给出提示,并跳过无效处理;quit 作为唯一退出条件,且退出前输出终值;
- 资源安全:Scanner 单次创建、显式关闭,符合 Java 最佳实践。
注意事项:
⚠️ 切勿在循环内新建 Scanner(System.in) —— 可能导致 NoSuchElementException 或输入流阻塞;
⚠️ 避免用 == 比较字符串内容,它只比较内存地址;
⚠️ 若需支持更复杂指令(如 "set 35"),建议引入 switch(input.toLowerCase()) 或正则解析,但本场景下 if-else 已足够简洁高效。
该方案轻量、可读性强,可直接集成至车辆模拟、游戏控制或教学演示项目中,是状态驱动交互逻辑的经典范例。










