这是“破解编码面试”一书中的一个问题。这是Java代码,但为什么会导致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);
}
}
答案 0 :(得分:0)
如果仔细调试代码,您会发现在比较内部for
循环中最后一个元素的值后,您会增加t
的值,从而增加{{1}的值将是t
。但是,数组索引从str.length
开始直到0
。因此,最终,当您尝试在索引str.length-1
处插入值时,您将获得异常。
答案 1 :(得分:0)
这真是奇怪的代码,命名和控制结构的使用......有问题......
当没有重复的字符时代码中断,t在所有迭代中增加它的值,最后是4,这就是导致异常的原因。
在示例中,代码仅与ss1崩溃,并与其他代码“协同工作”。