Java摩尔斯电码转英文翻译器触发ArrayIndexOutOfBounds异常如何修复
问题根因
- 最直接触发越界的原因:
morsetoEnglish方法内层遍历摩尔斯编码数组的循环中,错误执行了i++而非j++,导致外层循环的索引i无限制累加,很快超出拆分后的输入数组长度,触发ArrayIndexOutOfBoundsException。 - 拆分逻辑错误:
split("|")的参数是正则语法,实际会按单个字符拆分输入内容,完全不符合摩尔斯电码按空格分隔单个编码单元的规则,即使索引问题修复也无法正常匹配编码。 - 输入流残留问题:
Scanner.nextInt()读取选项后不会消费输入末尾的换行符,后续BufferedReader.readLine()会直接读取到空字符串,导致无法正常获取用户输入的翻译内容。 - 数组长度不匹配:
english数组包含26个字母+10个数字共36个元素,而原morse数组仅定义了26个字母的编码+1个分隔符共27个元素,缺少数字对应的摩尔斯编码,后续匹配时也会出现索引不对应的问题。
修复方案
1. 修复输入流换行符残留问题
在nextInt()调用后新增一行消费残留的换行符,同时调整异常类型为更符合场景的IllegalArgumentException:
translatorChoice = input.nextInt(); input.nextLine(); // 新增代码,吃掉nextInt遗留的换行符 if (translatorChoice != 1 && translatorChoice !=2 ){ throw new IllegalArgumentException("Please enter a valid number"); }
2. 补全摩尔斯编码数组,保证和英文字符数组一一对应
补全数字对应的摩尔斯编码,保证两个数组索引顺序完全匹配:
String[] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "|" };
3. 重写摩尔斯转英文方法
修复索引自增错误、拆分逻辑错误,新增匹配后跳出逻辑提升效率:
public static void morsetoEnglish (char[] english, String userInput, String[] morse){ // 按空格拆分单个摩尔斯编码,兼容多空格场景 String[] input = userInput.split("\\s+"); for (int i = 0; i < input.length; i++){ // 内层循环改为j自增 for (int j = 0; j < morse.length; j++){ if (morse[j].equals(input[i])) { // 分隔符|对应输出空格,其余输出对应字符 if (j == morse.length - 1) { System.out.print(" "); } else { System.out.print(english[j]); } break; // 匹配到结果后直接跳出内层循环,避免无效遍历 } } } }
内容的提问来源于stack exchange,提问作者ka177
相关产品推荐
相关产品推荐

