2014-01-22 63 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處插入值時,您將得到異常。

相關問題