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
相关产品推荐
相关产品推荐

