
Java 中遍历字符串时,若循环条件写为 ijava 中遍历字符串时,若循环条件写为 `i
在实现基础凯撒式字符偏移加密(如 BasicEncrypt.encrypt)时,一个常见却隐蔽的 bug 是:for 循环未能处理字符串的最后一个字符。根本原因在于循环终止条件设置错误——原代码中使用了:
for (i = 0; i <p>该条件使循环在 i 达到 text.length() - 2 时即终止,导致索引为 text.length() - 1(即最后一个有效字符)从未被访问。例如,输入 "a"(长度为 1)时,循环条件变为 i </p><p>✅ 正确的循环结构应为:</p><pre class="brush:php;toolbar:false;">for (int i = 0; i <p>此外,原代码中还存在另一类关键错误:<strong>混淆了“字符值运算”与“数组索引访问”</strong>。例如以下错误写法:</p><pre class="brush:php;toolbar:false;">// ❌ 错误:试图用 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 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。
通过修正循环边界与字符运算逻辑,即可确保每个输入字符(包括末尾字符)都被准确处理,彻底解决“丢失最后一个字符”的问题。










