2013-10-29 7 views
0

내 AP 컴퓨터 과학 수업을 행맨 게임을 만들고있어 문자열 문제를 해결하는 방법을 찾지 못했습니다. 경계 밖의 오류가 발생합니다. 문자열 색인이 범위를 벗어 : 7왜 내 문자열 인덱스가 범위를 벗어 났습니까?

여기 발생 : 그것은 어떤 도움 경우 여기

if(theGuess.equals(wordToGuess.substring(i,i+1))) 

프로그램 코드는

java.lang.StringIndexOutOfBoundsException 말한다.

import javax.swing.JOptionPane; 
public class Hangman extends BasicGame 
{ 
    private final String WORDCHOICES= "apple"+"great"+"zebra"+"mouse"+"chick"+"class"+"abhor"+"abide" 
     +"fuzzy"+"brute"+"blunt"+"comic"+"cater"+"stone"+"chaos"+"dufus"+"earth"+"decal"+"happy"+"heist" 
     +"idler"+"lions"+"hates"+"idols"+"lasso"+"lives"+"lisps"+"major"+"mound"+"mango"+"meter"+"mercy" 
     +"marry"+"pilot"+"plots"+"pants"+"overt"+"quack"+"paver"+"polls"+"scorn"+"sapid"+"sails"+"rowdy" 
     +"seeks"+"leech"+"seats"+"spade"+"shoes"+"slurp"; 
    private String wordToGuess; 
    private java.util.Random randy; 

    private int wordNum; 
    private int numCorrect=0; 
    private String[] correctLetters= new String[]{"","","","",""}; 
    HangDraw artist= new HangDraw(); 
    public Hangman() 
    { 
     super(); 
     randy= new java.util.Random(); 
     for(int i = 0; i<5;i++) 
      correctLetters[i]=null; 
     wordNum=0; 
     numCorrect=0; 
     artist.setUp(); 
    } 
    public void guess() 
    { 
     wordNum= 5*randy.nextInt(50); 
     numCorrect=0; 
     int wrong=0; 
     String userGuess=""; 
     int partsDrawn=0; 
     wordToGuess=WORDCHOICES.substring(wordNum,wordNum+5)+" "; 
     while(numCorrect<5&& partsDrawn<5) 
     { 
      userGuess= JOptionPane.showInputDialog("Guess a letter, so far you have: "+ correctLetters[0]+ 
         correctLetters[1]+correctLetters[2]+correctLetters[3]+correctLetters[4]); 

      if(checkLetter(userGuess)) 
      { 
       JOptionPane.showMessageDialog(null, "Correct Guess"); 
       //print the letter 
      } 
      else 
      { 
       //draw the part of the body 
       JOptionPane.showMessageDialog(null,"incorrect"); 
       partsDrawn++; 
       artist.drawParts(partsDrawn); 
      } 
     } 
     if(partsDrawn==5) 
     { 
      JOptionPane.showMessageDialog(null, "failed to guess, the word is: "+wordToGuess); 
     } 
     else 
     { 
      JOptionPane.showMessageDialog(null, "correct, the word was: "+ wordToGuess); 
     } 
    } 

    private boolean checkLetter(String theGuess) 
    { 
     boolean matches=false; 
     for(int i=0;i<wordToGuess.length();i++) 
     { 
      if(theGuess.equals(wordToGuess.substring(i,i+1))) 
      { 
       correctLetters[i]=theGuess; 
       matches=true; 
       numCorrect++; 
      } 
     } 
     return matches; 
    } 

} 

이 문제는 앞의 for 루프 범위를 벗어날 것을 당신이

+4

당신은'WORDCHOICES'는 다음과 같은 문자열 알고 있습니까? 배열을 사용하지 않는 이유는 무엇입니까? 그러면 단어가 5 자로 제한되지 않습니다. – Cruncher

+0

배열을 사용하기로되어 있지는 않았지만 선생님은 250 자 문자열로 50 5 자의 단어를 원했습니다. 조언을 해주셔서 감사합니다. – abysmaldan

+2

매일 같이 선생님이 만든 다른 미친 요구 사항이있는 것처럼 보입니다. 문자열 조작을 가르치고 싶다면, 배열/콜렉션에서 훨씬 더 나은 해를 가진 예제를 사용하지 마십시오. 분명히 그것은 당신의 잘못이 아니며, 나는 때때로 정말로 이해하지 못합니다. – Cruncher

답변

0

분명히 범위를 벗어났습니다. 문자열 끝에서 부분 문자열을 지정할 수 없습니다.

for(int i=0;i<wordToGuess.length();i++) 
{ 
    if(theGuess.equals(wordToGuess.substring(i,i+1))) 
    { 
     correctLetters[i]=theGuess; 
     matches=true; 
     numCorrect++; 
    } 
} 
알아내는

가장 빠른 방법은 변경 다음 응용 프로그램을

+1

하위 문자열의 endIndex는 exclusive이므로 wordToGuess.length()와 같을 수 있습니다. 솔루션에서는 마지막 문자를 건너 뜁니다. – Daniel

+0

그래, 고마워, 그래도 마지막 문자를 확인해 줘야 했어. 이전 섹션에서도 wordToGuess의 끝에 ""연결 했으니 까. – abysmaldan

+2

@abysmaldan @abysmaldan 공간을 연결하면 끔찍한 해결책이다. 루프 매개 변수를 수정하십시오. – jlars62

0

제공하는 모든 도움을 주셔서 감사합니다 for(int i=0;i<=wordToGuess.length();i++). 그러면 문자열의 사용 가능한 문자 끝에서 반복됩니다. 끝점 표기법을 사용하는 하위 문자열 함수를 사용 중이므로 후자의 끝점은 문자열 경계 내에 있어야하므로이 루프는 for(int i=0;i<wordToGuess.length();i++)으로 지정해야합니다. 이렇게하면 마지막 반복에서 IndexOutOfBoundsError이 호출되지 않습니다. beginIndex가 음수이거나 endIndex가 String 객체의 길이보다 크거나 beginIndex가 endIndex보다 큰 경우

+0

코드는 건너 뛸 것이다. 마지막 문자./마지막으로 수정했습니다. – Daniel

+0

수정되었습니다. 감사합니다. 끝점의 Java 문서에서 '독점'마커를 놓쳤습니다. – abiessu

3

자바 docs에 의하면, 문자열 # 1 스트링은 IndexOutOfBoundsException

을 던진다.

루프의 마지막 반복에서

, i 문자열의 length 동일하며, i+1 문자열의 길이, 따라서 예외보다 크다. i가 될 때 지금 루프, 순간에 오기 때문에,

for(int i=0;i<=wordToGuess.length();i++) 

for(int i=0;i<wordToGuess.length();i++) 
      ^^^ 
0
i<wordToGuess.length()에, i<=wordToGuess.length()에서 for 루프에서 당신의 상태를 변경

:

그래서 당신은 변경해야 마지막 요소이므로 i+1은 자연스럽게 "범위 밖"을 가리 킵니다.

0

메이크업을 디버깅하는 것입니다

for(int i=0;i<wordToGuess.length();i++) 
+0

이 문제가 해결되는 이유는 무엇이며 OP의 오류는 무엇입니까? – Mark

1

귀하의 루프는

for(int i=0;i<=wordToGuess.length();i++) 간단한 예제를 가정하자입니다 wordToGuess="ABC"

루프는 i = 0 ~ i에 대한 값을 생성합니다.= 3.

i = 0 인 경우 첫 번째 문자를 선택하고 두 번째 i = 1, 두 번째 i = 2, 세 번째 i = 3은 의미가 없습니다.

따라서 for(int i=0;i<wordToGuess.length();i++)

0

코어 자바 잘못 무엇을 말하는에서 끝내 사용합니다. if(theGuess.equals(wordToGuess.substring(i,i+1)))이 IndexOutOfBoundsException을 던지고 있다고 말했습니까? 즉, wordToGuess 길이가 1 자 (즉 빈 문자열)보다 작음을 의미합니다. 기본적으로 길이 1 [i, i + 1]의 부분 문자열을 얻으려고 시도하고 있습니다.

당신이 학생이기 때문에 이러한 문제를 해결하는 것이 중요하다고 생각하기 때문에 for 루프 조건을 살펴보십시오. 또한 디버거를 사용하여 코드를 단계별로 실행하거나 적어도 System.out.println (wordToGuess) 문을 넣어서 값이 무엇인지 확인하십시오. `applegreatzebramousechickclassabhorabidefuzzybrutebluntcomiccaterstonechaosdufusearthdecalhappyheistidlerlionshatesidolslassoliveslispsmajormoundmangometermercymarrypilotplotspantsovertquackpaverpollsscornsapidsailsrowdyseeksleechseatsspadeshoesslurp` :

관련 문제