字符串索引超出范围:-1;子串问题

时间:2012-09-27 22:06:48

标签: java string exception

我正在编写一个用于计算字符串中单词的类的程序,如果输入的字符串超过3个单词,则再次打印该句子,但每个单词都在其自己的行上。

所以我试图用\n替换空格。当我输入一个超过3个单词的句子时,我得到:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.substring(String.java:1937)
        at lab3.main(lab3.java:32)

这是我的代码:

import java.util.Scanner;

public class lab3 {

public static void main(String [] args) {

    Scanner scan = new Scanner (System.in);

    int wordCount = 1;
    char aChar;

    System.out.println("Enter a sentence.");

    String sentence = scan.nextLine();
    int charCount = sentence.length();

    for (int i=0; i < sentence.length(); i++){
            if (sentence.charAt(i) != ' '){

                    continue;
            } else {
                    wordCount++;
                    }
            }

    System.out.println("Number of words = " + wordCount);

            if (wordCount >= 4){
            for (int i = 0; i <= charCount; i++){
                    int space = sentence.indexOf(" ");
                    int endSpace = space + 1;
                    sentence = sentence.substring(0, space) 
                            + "\n"
                            + sentence.substring(endSpace, sentence.length());
                    }
                    System.out.println(sentence);

            } else {
            System.out.println(sentence);

            }

    }
}

问题似乎来自第31行的for循环,但是当我输入超过3个单词的句子时,我不明白它是如何返回-1的。我使用子串错了吗? 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

您需要在此处检查space的索引。如果找不到搜索字符串,String.indexOf()将返回-1

int space = sentence.indexOf(" ");
int endSpace = space + 1;
if (space != -1) {
    sentence = sentence.substring(0, space) + "\n"
            + sentence.substring(endSpace, sentence.length());
}

答案 1 :(得分:1)

如果您想保留代码,那么在执行 sentence.index(“”)时,如果返回-1,则必须进行检查。如果它返回你的循环突破如下。 但是,这不是一种很好的编码方式。我宁愿使用String API中的正则表达式或其他更简单的方法。

 if (wordCount >= 4){
            for (int i = 0; i <charCount-3; i++){
                    int space = sentence.indexOf(" ");
                    if(space==-1){// check if space is -1
                        break;
                    }   
                    System.out.println(i+ " " + space);
                    int endSpace = space + 1;
                    sentence = sentence.substring(0, space)
                            + "\n"
                         + sentence.substring(endSpace, sentence.length()-1);
                    }
                    System.out.println(sentence);

答案 2 :(得分:0)

  • 我自己,我会使用String#split(...)方法,只需几行代码即可解决这个问题。
  • 但是如果你必须这样做,不要做for循环或循环charCount次,因为charCount是String的大小,你肯定不想循环这么多次。它没有意义。相反,你想循环空格的数量,而不是字符的数量,这使我得到了下一个建议:
  • 使用while循环,而不是for循环并循环,直到indexOf(...)方法返回-1。换句话说,让Java尽一切努力弄清楚String何时耗尽空间而不是你猜测。

答案 3 :(得分:0)

我的解决方案不检查实际上不是单词的单词,

import java.util.Scanner;

public class SentenceWordCount {
    Scanner s = new Scanner (System.in);
    int wordCount;

    public SentenceWordCount() {
        System.out.println("Enter a sentence");

        String sentenceEntered = s.nextLine();
        String[] brokenSentence = sentenceEntered.split(" ");

        wordCount = brokenSentence.length;

        if(wordCount > 3){
        for(String s : brokenSentence){
                System.out.println(s);
            }
        }

        System.out.println("Number of words equals : " + wordCount);
    }
}

干杯,

杰米