java.lang.ArrayIndexOutOfBoundsException:索引 0 超出长度 0 的范围

时间:2021-02-26 18:50:49

标签: java arrays exception indexoutofboundsexception

public class demo {
    
    public void countCharacter(char[] ch) {
        
        String str=new String(ch);
        
        int count = 0,len=0;
        
        do {
            char[] charToLoop = str.toCharArray();
            
            len = charToLoop.length ;
            count = 0;
            
            for(int i=0;i < len;i++) {
                
                if(charToLoop[0] == charToLoop[i]) {
                    count++;
                }
            }
                if(count!=0) {
                    System.out.println(charToLoop[0] + " " + count);
                }
                
                str = str.replace(""+charToLoop[0], "");

        } while (len != 0);

    }
    
    public static void main(String[] args) {
        
        
        String s;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your String");
        
        s = sc.nextLine();
        
        char[] ch = s.toCharArray();
        
        demo l4 = new demo();
        
        l4.countCharacter(ch);
    
    }
  
}

输出:

<块引用>

输入您的字符串
萨那
s 1
一个 2
n 1
线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 0 超出长度 0 的边界

不使用try/catch,如何解决这个异常?

1 个答案:

答案 0 :(得分:0)

您可以通过在正确的时间重新计算字符串的长度来解决问题:

        } while (str.length() > 0);

说明:

ArrayIndexOutOfBounds 是因为你进入循环的次数太多了;您要比较的“len”不再是 str.replace 将其至少减少 1 之后的字符串长度。

Putting while (len > 1 ) 修复了输入 'sana' 的问题,但对于 'snaa' 仍然会失败,因为 str.replace 替换了第一个参数的所有出现; 所以两个'a'字符都被一次性删除,并且输入'snaa'在一次循环中将字符串的长度从2减少到0。

while 语句中的验证使用的是 'stale' 数据:在 str.replace 完成其工作后,'len' 不再保存字符串的长度;所以在做验证的时候再计算一下:while (str.length() > 0).

旁注:

  • do { ... } while()while(){ ... } 难多了。在您的情况下:您的示例仍然会因空输入而失败(用户只需按 Enter)。但是 while(str.length() > 0) { ... } 会自动捕获它,因为它不允许第一次通过循环体。老实说,我认为 do-while 没有任何合理的用途。

  • 当然这不是一个性能练习,但可以考虑只使用 char[] ch 参数,而不用创建一个字符串来实现相同的目标。 str = str.replace(...) 是一个非常繁重的解决方案。