
本文详解如何将字符串按每行约20字符自动换行,且确保断点位于最近的空格处(不截断单词),避免 StringIndexOutOfBoundsException,并提供健壮、可复用的 Java 实现方案。
本文详解如何将字符串按每行约20字符自动换行,且确保断点位于最近的空格处(不截断单词),避免 `stringindexoutofboundsexception`,并提供健壮、可复用的 java 实现方案。
在文本处理中,简单按固定长度(如每20字符)截断字符串会导致单词被强行割裂,严重影响可读性。理想做法是:在目标位置(如第20个字符)附近向后查找第一个空格,并以此作为换行点;若该范围内无空格,则退而求其次,在目标位置前查找最后一个空格;若仍无空格(如长单词或无空格字符串),则强制在目标位置断开。这正是“智能断行”的核心逻辑。
你原代码中的关键问题在于:
- endPos = 20 是硬编码,未动态查找空格;
- startPos = endPos + 1 在首次循环后会使 startPos=21,而 substring(21, 20) 参数顺序非法(起始索引大于结束索引),直接触发 StringIndexOutOfBoundsException;
- 循环未更新 endPos,导致无限重复打印同一子串。
以下是修正后的完整实现,兼顾鲁棒性与可读性:
import java.util.Scanner;
public class LineWrapper {
private static final int MAX_LINE_LENGTH = 20;
public static void main(String[] args) {
System.out.println("Please input a word: ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine().strip();
int startPos = 0;
while (startPos < input.length()) {
int endPos = findBreakPoint(input, startPos);
System.out.println(input.substring(startPos, endPos));
startPos = endPos + 1; // 移动到断点后一位,跳过空格进入下一行
}
scanner.close();
}
// 查找从 startPos 开始、适合换行的位置(优先向后找空格,失败则向前找,再失败则强制截断)
private static int findBreakPoint(String s, int start) {
int target = start + MAX_LINE_LENGTH;
// 情况1:target 已超出字符串末尾 → 直接返回末尾
if (target >= s.length()) {
return s.length();
}
// 情况2:向后查找第一个空格(含 target 位置及之后)
int spaceAfter = s.indexOf(' ', target);
if (spaceAfter != -1) {
return spaceAfter;
}
// 情况3:向前查找最后一个空格(从 target-1 往回搜)
int spaceBefore = s.lastIndexOf(' ', target - 1);
if (spaceBefore != -1) {
return spaceBefore;
}
// 情况4:前后均无空格(如连续长单词)→ 强制在 target 处断开
return target;
}
}关键说明:
- startPos = endPos + 1 的含义是:当前行以 endPos 结束(该位置为空格),下一行应从 endPos + 1 开始(跳过空格),这是保证不重复、不遗漏字符的核心。
- findBreakPoint 方法分层处理边界情况,避免崩溃:先判越界,再向后找空格(更自然),再向前找,最后兜底强制截断。
- 使用 strip() 预处理输入,消除首尾空白干扰逻辑。
运行示例:
输入:"Hello there, I am doing some coding, I need some help"
输出:
Hello there, I am doing some coding, I need some help
此方案不仅解决你的报错,更形成一套可嵌入任意文本渲染场景的通用断行工具——无论是控制台日志美化、CLI 界面排版,还是生成 Markdown 预览,均可直接复用 findBreakPoint 逻辑。

















