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

Java ArrayList实现摩尔斯电码转换器报错求助:IndexOutOfBoundsException

解决摩尔斯电码转换器的初始化索引越界问题

看起来你在静态初始化ArrayList的时候踩了个坑——那个IndexOutOfBoundsException是因为你直接用add(65, "你的摩尔斯码")这种带索引的添加方法,但此时你的ArrayList还是空的(size=0),而add(int index, E element)要求索引必须小于等于当前列表的大小,空列表只能往索引0的位置加元素,直接用65肯定会越界,进而触发ExceptionInInitializerError(因为错误发生在静态初始化块里)。

下面给你两种符合要求(只用ArrayList,不能用HashMap/HashSet)的正确实现方案:

方案1:利用ASCII码直接映射索引(高效推荐)

这个方法是利用大写字母的ASCII码范围(A=65到Z=90),先把ArrayList填充到足够大的容量,再用set方法给对应索引赋值,这样字母的ASCII码值就直接对应列表的索引,转换时直接取值就行:

import java.util.ArrayList;
import java.util.Scanner;

public class MorseCodeConverter {
    private static ArrayList<String> morseCodeMap;

    static {
        morseCodeMap = new ArrayList<>();
        // 先填充空字符串到索引90(覆盖所有大写字母的ASCII码)
        for (int i = 0; i <= 90; i++) {
            morseCodeMap.add("");
        }
        // 逐个设置字母对应的摩尔斯电码
        morseCodeMap.set(65, ".-");    // A
        morseCodeMap.set(66, "-...");  // B
        morseCodeMap.set(67, "-.-.");  // C
        morseCodeMap.set(68, "-..");   // D
        morseCodeMap.set(69, ".");     // E
        morseCodeMap.set(70, "..-.");  // F
        morseCodeMap.set(71, "--.");   // G
        morseCodeMap.set(72, "....");  // H
        morseCodeMap.set(73, "..");    // I
        morseCodeMap.set(74, ".---");  // J
        morseCodeMap.set(75, "-.-");   // K
        morseCodeMap.set(76, ".-..");  // L
        morseCodeMap.set(77, "--");    // M
        morseCodeMap.set(78, "-.");    // N
        morseCodeMap.set(79, "---");   // O
        morseCodeMap.set(80, ".--.");  // P
        morseCodeMap.set(81, "--.-");  // Q
        morseCodeMap.set(82, ".-.");   // R
        morseCodeMap.set(83, "...");   // S
        morseCodeMap.set(84, "-");     // T
        morseCodeMap.set(85, "..-");   // U
        morseCodeMap.set(86, "...-");  // V
        morseCodeMap.set(87, ".--");   // W
        morseCodeMap.set(88, "-..-");  // X
        morseCodeMap.set(89, "-.--");  // Y
        morseCodeMap.set(90, "--..");  // Z
    }

    public static String convertToMorse(String input) {
        if (input == null || input.isBlank()) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        for (char c : input.toUpperCase().toCharArray()) {
            int asciiValue = (int) c;
            // 只处理大写字母,其他字符用三个空格分隔(摩尔斯电码的单词间隔)
            if (asciiValue >= 65 && asciiValue <= 90) {
                result.append(morseCodeMap.get(asciiValue)).append(" ");
            } else {
                result.append("   ");
            }
        }
        // 移除末尾多余的空格
        return result.toString().trim();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入要转换的单词:");
        String inputWord = scanner.nextLine();
        System.out.println("转换结果:" + convertToMorse(inputWord));
        scanner.close();
    }
}

方案2:用两个ArrayList配对存储(直观易懂)

如果觉得ASCII映射有点绕,也可以用两个ArrayList,一个存字母,一个存对应的摩尔斯电码,转换时通过索引匹配:

import java.util.ArrayList;
import java.util.Scanner;

public class MorseCodeConverter {
    private static ArrayList<Character> letters;
    private static ArrayList<String> morseCodes;

    static {
        letters = new ArrayList<>();
        morseCodes = new ArrayList<>();
        // 按顺序添加字母和对应摩尔斯电码
        letters.add('A'); morseCodes.add(".-");
        letters.add('B'); morseCodes.add("-...");
        letters.add('C'); morseCodes.add("-.-.");
        letters.add('D'); morseCodes.add("-..");
        letters.add('E'); morseCodes.add(".");
        letters.add('F'); morseCodes.add("..-.");
        letters.add('G'); morseCodes.add("--.");
        letters.add('H'); morseCodes.add("....");
        letters.add('I'); morseCodes.add("..");
        letters.add('J'); morseCodes.add(".---");
        letters.add('K'); morseCodes.add("-.-");
        letters.add('L'); morseCodes.add(".-..");
        letters.add('M'); morseCodes.add("--");
        letters.add('N'); morseCodes.add("-.");
        letters.add('O'); morseCodes.add("---");
        letters.add('P'); morseCodes.add(".--.");
        letters.add('Q'); morseCodes.add("--.-");
        letters.add('R'); morseCodes.add(".-.");
        letters.add('S'); morseCodes.add("...");
        letters.add('T'); morseCodes.add("-");
        letters.add('U'); morseCodes.add("..-");
        letters.add('V'); morseCodes.add("...-");
        letters.add('W'); morseCodes.add(".--");
        letters.add('X'); morseCodes.add("-..-");
        letters.add('Y'); morseCodes.add("-.--");
        letters.add('Z'); morseCodes.add("--..");
    }

    public static String convertToMorse(String input) {
        if (input == null || input.isBlank()) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        for (char c : input.toUpperCase().toCharArray()) {
            int matchIndex = letters.indexOf(c);
            if (matchIndex != -1) {
                result.append(morseCodes.get(matchIndex)).append(" ");
            } else {
                result.append("   ");
            }
        }
        return result.toString().trim();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入要转换的单词:");
        String inputWord = scanner.nextLine();
        System.out.println("转换结果:" + convertToMorse(inputWord));
        scanner.close();
    }
}

关键修复点

你之前的代码报错核心是:在空的ArrayList上使用add(int index, E element)插入到非0索引的位置。上面的两种方案都避开了这个问题:

  • 方案1先填充足够的空元素,再用set修改对应位置的值(set只要求索引小于列表大小,这里已经提前填充到90了);
  • 方案2用无参add追加元素,两个列表的索引自然对应,不会越界。

内容的提问来源于stack exchange,提问作者Madiyar Kupzhassarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:16:15