You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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!
    }
}

代码解释

  1. 修正字母表:把ABC和ABC_UPPER都写成正确的重复字母表,这样移位13位后不用处理模运算,直接取index+13的位置即可(因为字母表长度是26,重复后前26是原字母,后26是移位13后的结果)。
  2. 初始化结果数组:根据输入字符串的长度创建translated数组,避免索引越界。
  3. 大小写兼容:同时处理小写和大写字母,非字母字符(比如空格、感叹号)直接保留,符合ROT13的预期行为。
  4. 空值判断:先判断输入是否为空,避免空指针异常。

现在运行测试代码,就能正常输出ROT13转换后的结果啦~

内容的提问来源于stack exchange,提问作者Lee Land Hills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:58