2012-07-29 3 views
0

그래서 나는 $로 바뀌는 모든 모음으로 단어를 인쇄하는 프로그램을 작성하려고합니다. java에 스레드의 예외 java.lang.StringIndexOutOfBoundsException : 문자열 인덱스가 범위를 벗어났습니다 : 6

나는이 오류가 계속 발생하면 exception in thread main java.lang.StringIndexOutOfBoundsException: String index out of range: 6 실행할 때 잘 컴파일됩니다. 여기 코드는 입니다.

import java.util.*; 

public class SummerFour 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 

     int cnt = 0; 
     String word; 
     String output = ""; 
     char letter = 'x'; 
     System.out.print("enter word to test: "); 
     word = keyboard.nextLine(); 

     do { 

      cnt++; 
      letter = word.charAt(cnt - 1); 

      if (letter == 'a' || letter == 'i' || letter == 'e' || letter == 'u' || letter == 'o') 
      { 
       letter = '$'; 
      } 
     } 
     while (cnt <= word.length()); 

     System.out.println(word); 
    } 
} 

답변

1

do ... while 루프에 off-by-one 오류가 있습니다. cnt이 문자열의 크기보다 작거나 같은지 확인한 다음 값을 1 씩 증가시키고 해당 값 -1을 사용하여 String.charAt()의 색인으로 사용합니다. String은 0에서부터 인덱싱되기 때문에 문제가됩니다. String의 끝에서 항상 너무 멀리 갈 것입니다.

이 예제에 대해 생각 :

tacos

이 다섯 글자로 된 단어입니다. cnt = 5 일 때, 루프를 한 번 더 (5가 5보다 작거나 같기 때문에) 다시 돌아가 cnt을 6으로 증가시킵니다. 그런 다음 String.charAt()을 5 (6 -1)의 값으로 호출하지만 tacos은 0-4 (0 = t, 1 = a, 2 = c, 3 = o, 4 = s)이므로 5가 범위를 벗어납니다. 당신은 ... 당신의 할 일을 제대로 루프 작업하는 동안이 같은 수행하여 덜 혼란을 볼 수 있습니다

물론
do 
    { 
     letter = word.charAt(cnt); 

     if (letter=='a'||letter=='i'||letter=='e'||letter=='u'||letter=='o') 
     { 
      letter='$'; 
     } 
     cnt++; 
    } while(cnt<word.length()); 

, 그래도 코드가 사용자가 원하는 일을하지 않습니다,하지만 당신은 더 이상 얻을 원래의 오류. 이것이 숙제일지도 모르는 것처럼 보이기 때문에 계속해서 일하게 할 것입니다.

+1

프로젝트에 5 세트 중 하나 인 여름 프로젝트가 좋았지 만 그게 내가 본 적이없는 오류 일 뿐이므로 컴파일러는 초보자이기 때문에 무엇을해야할지 몰랐다. 도움을 주셔서 감사합니다. – user1560400

관련 문제