Java循环未读取字符串最后字符问题求助
问题分析与解决
核心问题1:循环条件错误导致丢失最后一个字符
原代码的循环条件是:
for(i = 0; i < text.length() -1; i++)
字符串索引从0开始,长度为n的字符串,最后一个字符的索引是n-1。这个条件会让循环在i = n-2时就停止,永远不会处理最后一个字符,所以输入单个字符时循环根本不会执行,返回空字符串。
正确的循环条件应该是:
for(i = 0; i < text.length(); i++)
这样就能遍历从索引0到text.length()-1的所有字符。
核心问题2:语法错误引发的误导
你说修改循环条件后出现索引越界,实际是因为代码里的else if分支有语法错误:
code = code + text.charAt(i) + rule);
这里多了一个多余的右括号),导致编译失败。修正后还要补上强制类型转换(否则text.charAt(i)+rule会被当作整数拼接,比如'a'+1会变成98而非字符'b'),正确写法是:
code = code + (char)(text.charAt(i) + rule);
优化实现:修正语法+提升效率
频繁用String +=拼接字符串会产生大量中间对象,效率低下,建议改用StringBuilder,同时调整类结构(原代码main方法写在类外不符合Java语法):
public class BasicEncrypt { public static String encrypt(String text, int rule) { StringBuilder code = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char original = text.charAt(i); int newVal = original + rule; if (newVal > 255) { code.append((char) (newVal - 255)); } else { code.append((char) newVal); } } return code.toString(); } public static void main(String[] args) { System.out.println(BasicEncrypt.encrypt("abcdef", 1)); // 输出bcdefg System.out.println(BasicEncrypt.encrypt("a", 1)); // 输出b } }
补充说明
如果rule数值较大(比如超过255),可以用newVal % 256替代减法,简化循环逻辑,效果是一致的。
内容的提问来源于stack exchange,提问作者PJ Pasta
相关产品推荐
相关产品推荐

