是什么导致ArrayIndexOutOfBoundsException?

时间:2014-01-22 11:58:11

标签: java

这是“破解编码面试”一书中的一个问题。这是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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这真是奇怪的代码,命名和控制结构的使用......有问题......

当没有重复的字符时代码中断,t在所有迭代中增加它的值,最后是4,这就是导致异常的原因。

在示例中,代码仅与ss1崩溃,并与其他代码“协同工作”。