Java程序遇索引越界或丢失末尾字符,如何修复?
Java字符串处理异常及字符丢失问题修复
原问题代码
import java.util.Scanner; class Assignment4 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Type the message to be shortened"); String msg = scan.nextLine(); msg = msg.toLowerCase(); String alg1 = ""; int vowelC = 0; int repeatC = 0; System.out.println("Algorithm 1"); for (int i = 0; i<msg.length();i++){ if(msg.substring(i-1,i).equals(" ")){ alg1+=msg.substring(i,i+1); } else{ if (msg.substring(i,i+1).equals("a") || msg.substring(i,i+1).equals("e") || msg.substring(i,i+1).equals("i") || msg.substring(i,i+1).equals("o") || msg.substring(i,i+1).equals("i")){ vowelC++; } else if (msg.substring(i,i+1).equals(msg.substring(i-1,i))){ repeatC++; } else{ alg1+=msg.substring(i,i+1); } } } System.out.print(alg1); } }
问题说明
该代码运行时抛出索引越界异常(索引为-1),原因是循环起始i=0时,访问msg.substring(i-1,i)会取索引-1到0的子串,超出字符串范围。修改循环条件为i < msg.length()-1会丢失最后一个字符,将循环起始值设为1则会丢失首字符,需要找到能完整处理所有字符且无报错的修改方式。
修复后的代码
import java.util.Scanner; class Assignment4 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Type the message to be shortened"); String msg = scan.nextLine(); msg = msg.toLowerCase(); String alg1 = ""; int vowelC = 0; int repeatC = 0; System.out.println("Algorithm 1"); for (int i = 0; i < msg.length(); i++) { char currentChar = msg.charAt(i); // 处理首字符,无前置字符 if (i == 0) { if (currentChar == 'a' || currentChar == 'e' || currentChar == 'i' || currentChar == 'o' || currentChar == 'u') { vowelC++; } else { alg1 += currentChar; } } else { char prevChar = msg.charAt(i-1); // 前置字符是空格,保留当前字符 if (prevChar == ' ') { alg1 += currentChar; } else { // 判断是否为元音 if (currentChar == 'a' || currentChar == 'e' || currentChar == 'i' || currentChar == 'o' || currentChar == 'u') { vowelC++; } // 判断是否和前置字符重复 else if (currentChar == prevChar) { repeatC++; } // 非元音非重复,保留字符 else { alg1 += currentChar; } } } } System.out.print(alg1); } }
修复关键点
- 避免索引越界:对
i=0的首字符单独处理,不访问i-1的索引 - 完整遍历字符:循环保持
i < msg.length(),确保每个字符都被处理 - 优化字符获取:用
charAt()替代substring(),代码更简洁高效 - 修正元音判断:原代码重复判断了"i",补充了遗漏的"u"
- 逻辑一致性:首字符直接判断是否为元音,非元音则保留;后续字符按原逻辑判断前置空格、重复字符、元音,确保功能不变
内容的提问来源于stack exchange,提问作者Ethan Coleman
相关产品推荐
相关产品推荐

