
本文详解如何编写java程序,接收用户多行输入并逐行逆序输出,重点解决因遗漏更新输入导致的无限循环错误("too much output, unterminated loop")。
本文详解如何编写java程序,接收用户多行输入并逐行逆序输出,重点解决因遗漏更新输入导致的无限循环错误("too much output, unterminated loop")。
你的原始代码逻辑目标清晰:读取每行输入 → 若非终止指令("Done"/"done"/"d")→ 逆序打印该行 → 继续循环。但关键缺陷在于 userInput 的更新位置错误:scnr.nextLine() 被放在了 while 循环体末尾,而循环条件却依赖于旧值判断——导致一旦进入循环,userInput 永远不变,for 循环反复执行同一行的逆序输出,形成死循环,最终触发平台输出限制报错。
正确做法是:每次循环开始前获取新输入,并在循环体内完成处理与输出。以下是修正后的完整可运行代码:
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
String userInput;
// 首次读取输入
userInput = scnr.nextLine();
// 循环条件:只要不是终止指令,就持续处理
while (!userInput.equals("Done") &&
!userInput.equals("done") &&
!userInput.equals("d")) {
// 逆序输出当前行:从最后一个字符向前遍历
for (int i = userInput.length() - 1; i >= 0; i--) {
System.out.print(userInput.charAt(i));
}
System.out.println(); // 每行逆序后换行
// ✅ 关键修复:在循环末尾立即读取下一行输入
userInput = scnr.nextLine();
}
// 注意:当输入为 "Done"/"done"/"d" 时,循环直接退出,不作任何输出
scnr.close(); // 推荐显式关闭Scanner资源
}
}
关键修正点说明:
- ✅ userInput = scnr.nextLine() 移至 while 循环体末尾(紧邻 } 前),确保每次迭代都更新输入值;
- ✅ 逆序 for 循环改用更直观的 i = length-1; i >= 0; i-- 写法,避免索引越界风险;
- ✅ 每行逆序后调用 System.out.println() 换行,保证输出格式与示例一致;
- ✅ 添加 scnr.close() 防止资源泄漏(良好实践)。
运行示例:
输入:
Hello there Hey done
输出:
ereht olleH yeH
注意事项:
- 字符串比较务必使用 .equals(),而非 ==(后者比较引用地址);
- 终止条件需覆盖全部大小写变体("Done", "done", "d"),当前逻辑已满足;
- 若需忽略首尾空格干扰,可在比较前调用 userInput.trim();
- 在在线评测环境(如 zyBooks)中,未及时更新输入是引发 unterminated loop 的最常见原因,务必检查循环变量/输入状态是否被正确刷新。
掌握输入更新时机与循环边界控制,是编写健壮交互式程序的基础能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











