2014-10-20 245 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