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

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);
  }
}

修复关键点

  1. 避免索引越界:对i=0的首字符单独处理,不访问i-1的索引
  2. 完整遍历字符:循环保持i < msg.length(),确保每个字符都被处理
  3. 优化字符获取:用charAt()替代substring(),代码更简洁高效
  4. 修正元音判断:原代码重复判断了"i",补充了遗漏的"u"
  5. 逻辑一致性:首字符直接判断是否为元音,非元音则保留;后续字符按原逻辑判断前置空格、重复字符、元音,确保功能不变

内容的提问来源于stack exchange,提问作者Ethan Coleman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:45:57