Java实现Rot13算法报错ArrayIndexOutOfBoundsException:41,求排查
解决Java ROT13实现中的ArrayIndexOutOfBoundsException问题
嘿,我看到你在自己实现ROT13算法时碰到了java.lang.ArrayIndexOutOfBoundsException: 41的错误,咱们来一步步拆解问题、修复代码~
首先排查核心错误点
你的代码里有几个关键问题导致了索引越界:
- 拼写错误的字母表:你定义的
abc字符串里,"abcdefghijklmnopjrstuvwxyz..."这部分把字母q写成了j,这会导致当查找q及之后的字符时,位置计算出错,进而访问数组时超出范围。 - 未初始化的结果数组:
translated数组只声明了但没初始化,直接赋值会引发空指针或者索引问题,得在方法里根据输入字符串的长度创建数组。 - 不完整的字符遍历逻辑:原代码里的遍历逻辑没写完,咱们得补全每个字符的转换逻辑。
修正后的完整代码
public class Rot13 { // 修正拼写错误,把重复的字母表写正确,包含小写+重复一次(方便ROT13移位) private static final String ABC = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; private static final String ABC_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"; public String ROT13(String input) { if (input == null || input.isEmpty()) { return input; } char[] sentence = input.toCharArray(); char[] translated = new char[sentence.length]; // 初始化结果数组 for (int i = 0; i < sentence.length; i++) { char c = sentence[i]; int index = ABC.indexOf(c); if (index != -1) { // 小写字母:移位13位 translated[i] = ABC.charAt(index + 13); } else { index = ABC_UPPER.indexOf(c); if (index != -1) { // 大写字母:移位13位 translated[i] = ABC_UPPER.charAt(index + 13); } else { // 非字母字符直接保留 translated[i] = c; } } } return new String(translated); } // 测试方法 public static void main(String[] args) { Rot13 rot13 = new Rot13(); System.out.println(rot13.ROT13("Hello World!")); // 输出 Uryyb Jbeyq! System.out.println(rot13.ROT13("Uryyb Jbeyq!")); // 输出 Hello World! } }
代码解释
- 修正字母表:把
ABC和ABC_UPPER都写成正确的重复字母表,这样移位13位后不用处理模运算,直接取index+13的位置即可(因为字母表长度是26,重复后前26是原字母,后26是移位13后的结果)。 - 初始化结果数组:根据输入字符串的长度创建
translated数组,避免索引越界。 - 大小写兼容:同时处理小写和大写字母,非字母字符(比如空格、感叹号)直接保留,符合ROT13的预期行为。
- 空值判断:先判断输入是否为空,避免空指针异常。
现在运行测试代码,就能正常输出ROT13转换后的结果啦~
内容的提问来源于stack exchange,提问作者Lee Land Hills
相关产品推荐
相关产品推荐

