2014-01-22 58 views
-4

这是“破解编码采访”一书中的一个问题。这里是Java代码,但为什么它会导致ArrayIndexOutOfBoundsException?我刚刚从这本书中复制过来。导致ArrayIndexOutOfBoundsException的原因是什么?

class Q1_3{ 
    public static void removeDuplicates(char[] str){ 
     if(str==null) return; 
     int len=str.length; 
     if(len<2) return; 

     int t=1; 

     for(int i=1;i<len;++i){ 
      int j; 
      for(j=0;j<t;++j){ 
       if(str[i]==str[j]) 
        break; 
      } 
      if(j==t){ 
       str[t]=str[i]; 
       ++t; 
      } 
     } 
     str[t]=0; //why ? 
    } 

    public static void main(String[] args){ 
     char ss1[] = {'a','b','c','d'}; 
     char ss2[] = {'a','a','a','a'}; 
     char ss3[] = {}; 
     char ss4[] = {'a','a','b','b'}; 
     removeDuplicates(ss1); 
     removeDuplicates(ss2); 
     removeDuplicates(ss3); 
     removeDuplicates(ss4); 
     System.out.println(ss1); 
     System.out.println(ss2); 
     System.out.println(ss3); 
     System.out.println(ss4); 
    } 
} 
+1

因为't> = str.length'在某个点上。调试您的代码以了解原因。 – Maroun

+0

最好你发布错误日志。 – jagmohan

+0

导致它*哪里*? – Raedwald

回答

0

这真是奇怪的代码,命名和使用控制结构,其...可疑的...

代码休息时,有没有重复的字符,吨所有迭代,并在年底增加了他的价值是4,这是什么原因导致异常。

在该示例中,代码只与ss1崩溃,并且与其他人“工作”。

+0

我现在知道错误的原因。但我不知道如何解决在Java中“删除字符串中的重复字符而不使用任何额外的缓冲区”的问题,你能帮助我吗?或更正代码? – ifanr

0

如果你仔细调试代码,你会发现,最后一个元素在内for循环比较值后,你增加的t的价值,因而t值将是str.length。但是,数组索引从0开始,直到str.length-1。因此,最终,当您尝试在索引str.length处插入值时,您将得到异常。

相关问题