2014-10-20 291 views
1

不認爲我沒有在網上搜索答案。爲什麼它給我outofbounds錯誤?Java - 替換字符串中的字符

我有兩個6個字符長的字符串。一個是「丹尼爾」,另一個是「------」。用戶輸入一個字符。循環遍歷「daniel」字符串並通過char檢查char是否與用戶輸入匹配。如果匹配,它應該用「------」中的那個替換猜測的字符。所以如果你輸入'a'它應該輸出「-a ----」,循環繼續。接下來,如果輸入'e',它應該輸出「-a - e-」等。代碼不會給出編譯錯誤或任何警告,並且也是非常有意義的。我試過子串並替換,但是這更簡單和更短。我試着調試它,但沒有提供有用的信息。我不知道爲什麼它會返回outofbounds錯誤。

package hello.world; 

import java.util.Scanner; 

public class HelloWorld { 
    public static void main(String[] args) { 
     Scanner in=new Scanner(System.in); 
     String word="daniel"; 
     StringBuilder guess2 = new StringBuilder("------"); 
     char guess; 

     System.out.println("**********************"); 
     System.out.println("* Welcome to Hangman *"); 
     System.out.println("**********************"); 

     for (int i=0;i<10;i++) { 
      System.out.print("Enter a letter: "); 
      guess=in.nextLine().charAt(0); 

      for (int j=0;i<word.length();j++) { 
       if (guess==word.charAt(j)) { 
        guess2.setCharAt(word.charAt(j), guess); 
        System.out.print(guess2); 
       } 
      } 
     } 
    } 
} 

輸出:

********************** 
* Welcome to Hangman * 
********************** 
Enter a letter: a 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 97 
    at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:380) 
    at java.lang.StringBuilder.setCharAt(StringBuilder.java:76) 
    at hello.world.HelloWorld.main(HelloWorld.java:22) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 2 seconds) 

回答

1

替換

guess2.setCharAt(word.charAt(j), guess); 

guess2.setCharAt(j, guess); 

第一個參數是所述字符的索引在StringBuilder更換,不是字符本身。

另外,在for循環中似乎有一個錯字使用i而不是j

for (int j=0;i<word.length();j++) { 
+0

是的,這就是它。我的上帝太傻了。我用j替換了word.charAt(j),它完美地工作。我總是以簡單爲目標,但有時候我只會讓事情複雜化。我可以在8分鐘內接受答案。 – djoomla 2014-10-20 20:30:06

0

string.length減()返回字符串1,而不是從0開始的長度所以每當你使用string.length減()總是使用比(<)符號less。

0

而不是使用的String builder你可以使用正則表達式+的replaceAll方法

for (int i=0;i<10;i++) { 
     System.out.print("Enter a letter: "); 
     guess=in.nextLine().charAt(0); 

     word = word.replaceAll("[^"+ guess +"]", "-"); 
     System.out.println(word); 
    } 

結果只是取代一切:

Enter a letter: a 
-a---- 
+0

謝謝,我想知道replaceAll是如何工作的。我會保存的。 – djoomla 2014-10-20 20:40:36