
本文详解如何编写java程序,接收用户多行输入,对每行文本进行逆序输出,并在输入"done"、"done"或"d"时安全终止程序;重点解决因循环逻辑错误导致的“too much output / unterminated loop”运行时异常。
本文详解如何编写java程序,接收用户多行输入,对每行文本进行逆序输出,并在输入"done"、"done"或"d"时安全终止程序;重点解决因循环逻辑错误导致的“too much output / unterminated loop”运行时异常。
问题核心在于原代码存在致命的逻辑缺陷:scnr.nextLine() 仅在循环外执行一次,而循环体内未更新 userInput 变量——导致条件判断始终基于初始输入,一旦不满足退出条件,程序便陷入无限循环,持续重复打印同一行的逆序结果,最终触发平台输出限制报错。
正确的做法是:将输入读取操作置于循环体内,并确保每次迭代都获取新输入。同时需注意字符串逆序逻辑的健壮性(如空字符串处理)和退出条件的完整性。
以下是修正后的完整可运行代码:
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")) {
// 逆序输出当前行(使用StringBuilder更简洁,此处保留字符索引方式便于理解)
int len = userInput.length();
for (int i = len - 1; i >= 0; i--) {
System.out.print(userInput.charAt(i));
}
System.out.println(); // 每行逆序后换行
// ✅ 关键修复:在循环末尾读取下一行输入
userInput = scnr.nextLine();
}
// 退出循环后程序自然结束(无需额外println)
}
}
关键修改说明:
- ✅ 将 userInput = scnr.nextLine(); 移入 while 循环末尾,确保每次迭代前 userInput 都被更新;
- ✅ 修正 for 循环索引:原代码 i=numCharacter; i>0; --i 易引发 StringIndexOutOfBoundsException(当 i-1 为负),现改为 i = len-1; i >= 0; i--,更安全直观;
- ✅ 在每次逆序输出后添加 System.out.println(),保证每行输出独立成行;
- ❌ 移除了循环外冗余的 System.out.println() 和重复的 userInput = scnr.nextLine(),避免逻辑混乱。
注意事项:
- 输入 "d" 会立即退出,不输出其逆序(即不输出 "d" 的逆序 "d"),符合题目要求;
- 空行("")会被正常逆序输出为空行;
- Scanner 默认以换行符分隔,无需额外处理行末空白;
- 若需忽略首尾空格,可在读取后调用 userInput.trim()。
该方案结构清晰、边界安全,彻底规避了无限循环风险,是控制台交互式文本处理的典型范式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











