
Java 中遍历字符串时,若循环条件写为 i < text.length() - 1,会导致最后一个字符被跳过;正确做法是使用 i < text.length(),并确保所有字符访问均基于索引 i 而非 i + rule,避免越界和逻辑错误。
java 中遍历字符串时,若循环条件写为 `i
在实现基础凯撒式字符偏移加密(如 BasicEncrypt.encrypt)时,一个常见却隐蔽的 bug 是:for 循环未能处理字符串的最后一个字符。根本原因在于循环终止条件设置错误——原代码中使用了:
for (i = 0; i < text.length() - 1; i++)
该条件使循环在 i 达到 text.length() - 2 时即终止,导致索引为 text.length() - 1(即最后一个有效字符)从未被访问。例如,输入 "a"(长度为 1)时,循环条件变为 i < 0,循环体一次都不执行,返回空字符串。
✅ 正确的循环结构应为:
for (int i = 0; i < text.length(); i++) {
// 处理 text.charAt(i)
}此外,原代码中还存在另一类关键错误:混淆了“字符值运算”与“数组索引访问”。例如以下错误写法:
// ❌ 错误:试图用 i + rule 作为字符串索引 text.charAt(i + rule) // 当 rule > 0 时极易越界!
i + rule 是偏移后的 ASCII 值(如 'a' + 1 → 98),而非合法索引。字符串索引必须始终在 [0, length-1] 范围内,因此所有 charAt(...) 的参数都应为 i,而字符值的加法运算(如 text.charAt(i) + rule)应在 char 提升为 int 后进行。
以下是修复后的完整、健壮的 encrypt 方法:
public static String encrypt(String text, int rule) {
if (text == null) return null;
StringBuilder code = new StringBuilder(); // 推荐使用 StringBuilder 替代字符串拼接
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
int shifted = ch + rule;
if (shifted > 255) {
code.append((char) (shifted - 255));
} else {
code.append((char) shifted);
}
}
return code.toString();
}? 关键改进说明:
- 使用 StringBuilder 提升多次拼接性能;
- 提前校验 null 输入,增强鲁棒性;
- 将 text.charAt(i) 提取为局部变量 ch,提升可读性与复用性;
- 所有字符操作均基于 ch 运算,杜绝 charAt(i + rule) 类越界风险。
⚠️ 注意事项:
- ASCII 取值范围为 0–127,但 Java char 是无符号 16 位整数(0–65535),此处用 255 作模数属自定义规则,需确保加解密双方约定一致;
- 若需真正安全的加密,请使用标准密码学库(如 javax.crypto),而非自行实现位移 cipher。
通过修正循环边界与字符运算逻辑,即可确保每个输入字符(包括末尾字符)都被准确处理,彻底解决“丢失最后一个字符”的问题。

















