Java子字符串错误:字符串索引超出范围

时间:2016-11-02 23:28:24

标签: java

我正在为学校做这项功课。我试图弄清楚如何从用户给出的字符串中获取单个单词。就我而言,单词始终用空格分隔。所以我的代码计算有多少空格然后生成子串。如果可以,请帮忙。

        System.out.print("Please enter a sentence: ");
        String userSentence=IO.readString();

        String testWord="";
        int countSpaces=0;


        for(int j=0; j<userSentence.length(); j++){
            if((userSentence.charAt(j))==' '){
                countSpaces++;

            }
        }


        for(int i=0; i<userSentence.length(); i++){
            if(countSpaces>0){

                while(userSentence.charAt(i)==' '){
                    i++;
                    countSpaces--;
                }

                testWord=userSentence.substring(i, userSentence.indexOf(" "));
                i=i+(testWord.length()-1);

            }

            if(countSpaces==0){
                testWord=userSentence.substring(i);
                i=userSentence.length();
            }

            System.out.print(testWord);

2 个答案:

答案 0 :(得分:0)

由于您没有提供整个代码部分,我只会指出您发布的内容有问题...

以下是您的for循环,其中“i”为其计数器...

for(int i=0; i<userSentence.length(); i++)
{
              // … Rarely (if ever) is “ i ” changed inside this loop!
  i++;                     // <--- this will cause a problem
  i=userSentence.length(); // <--- so will this
}

这将设置为遍历userSentence中的每个字符。 “i”是循环的计数器变量。如果你在循环中更改了计数器变量“i”(你做了好几次),那么你很可能会得到意想不到的结果。 “i”由循环结构自动递增。如果你改变它,循环很可能会破坏或不能按预期工作。

当你到达时出现错误...

testWord=userSentence.substring(i, userSentence.indexOf(" "));

考虑到它使用“i”作为索引,这并不罕见。  只是一个想法。

答案 1 :(得分:0)

如果我们不必计算空格,下面的代码会更清晰,但我假设这是你的约束,所以我正在滚动它。 (编辑:向JohnG致敬,因为有更好的方法来改变i

问题是,userSentence.indexOf(" ")函数将始终返回{em>找到" "的第一个位置,并且因为您继续递增i但不做对userSentence的任何更改,substring(i, userSentence.indexOf(" "))命令都不再合理。

上述解决方案是声明一个remainder字符串,用于跟踪找到下一个userSentence后剩余的testWord部分。

另一个警告是indexOf()如果没有找到" "的出现,将返回-1,在这种情况下意味着你​​在你的最后一个字上。在这种情况下,testWord的{​​{1}}将设置为remainder的结尾。

这就是我所拥有的。再次,超级笨重,但我试图不重写你所拥有的一切:

    System.out.print("Please enter a sentence: ");
    String userSentence=IO.readString();

    String testWord="";
    int countSpaces=0;

    for(int j=0; j<userSentence.length(); j++){
        if((userSentence.charAt(j))==' '){
            countSpaces++;
        }
    }

    for(int i=0; i<userSentence.length(); i++){
       while(i<userSentence.length() && userSentence.charAt(i)==' '){
          i++;
          countSpaces--;
       }       
       if(i<userSentence.length()){
          String remainder = userSentence.substring(i);

          if(countSpaces==0){
             testWord=userSentence.substring(i);
             i=userSentence.length();
          } else    {
             remainder = userSentence.substring(i);
             int endOfWordIndex = remainder.indexOf(" ");       //  set end of word to first occurrence of " "   
             if(endOfWordIndex == -1){                          //  if no " " found,
             endOfWordIndex = remainder.length();           //      set end of word to end of sentence.
          }

          testWord=remainder.substring(0, endOfWordIndex);              
          i=i+(testWord.length()-1);
        }

  System.out.println("word: '" + testWord + "'");