2014-01-22 4 views
-4

이것은 "Coding Interview"라는 책에서 질문입니다. 자바 코드가 있는데, 왜 이것이 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

정말 이상한 코드 명명하고 ... 의심 제어 구조의 사용의 ...

중복 된 문자가없는 코드 휴식을, t는 모든 반복과 마지막에 자신의 가치를 증가 4 인 경우 예외가 발생합니다.

예제에서 코드는 ss1에서만 충돌하고 다른 것들은 "작동"합니다.

+0

지금 버그에 대한 이유를 알고 있습니다. 하지만 "자바의 모든 추가 버퍼를 사용하지 않고 문자열의 중복 문자를 제거하는 방법"에 대한 질문을 해결하는 방법을 모르겠습니다. 또는 코드를 수정 하시겠습니까? – ifanr

0

당신이 밀접하게 코드를 디버깅하는 경우에는 내부 for 루프의 마지막 요소에 대한 값을 비교 한 후 t의 값을 증가 것을 발견 할 것이다, 따라서 t의 값은 str.length 될 것입니다. 그러나 배열 인덱스는 0부터 str.length-1까지입니다. 결국 인덱스 str.length에 값을 삽입하려고하면 예외가 발생합니다.

관련 문제