为什么我得到java.lang.StringIndexOutOfBoundsException?

时间:2011-09-19 13:32:49

标签: java string

我想编写一个程序,逐步打印单词,直到出现完整的句子。例如:我需要编写(输入)和输出:

  


  我需要
  我需要   我需要写。

这是我的代码:

public static void main(String[] args) {   
   String sentence = "I need to write.";
   int len = sentence.length();
   int numSpace=0;
   System.out.println(sentence);
   System.out.println(len);

   for(int k=0; k<len; k++){
      if(sentence.charAt(k)!='\t')
         continue;
      numSpace++;
   }

   System.out.println("Found "+numSpace +"\t in the string.");  

   int n=1;
   for (int m = 1; m <=3; m++) {      
      n=sentence.indexOf('\t',n-1);
      System.out.println("ligne"+m+sentence.substring(0, n));
   }
}

这就是我得到的:

  

我需要写。
  16个
  在字符串中找到0   线程“main”中的异常java.lang.StringIndexOutOfBoundsException:
  字符串索引超出范围:-1   java.lang.String.substring(String.java:1937)在   split1.Split1.main(Split1.java:36)Java结果:1构建成功
  (总时间:0秒)

我不明白为什么numSpace不计算空格的出现次数,也不知道为什么我没有得到正确的输出(即使我将numSpace替换为3)。

7 个答案:

答案 0 :(得分:1)

  1. 您没有\t个字符,因此indexOf(..)会返回-1
  2. 您尝试从0到-1的子字符串 - 失败
  3. 解决方案是检查:

    if (n > -1) {
        System.out.prinltn(...);
    }
    

答案 1 :(得分:1)

寻找numSpace的循环不正确。您正在寻找一个\t这是一个制表符,其中字符串中没有。

此外,当你在底部循环时,你会得到一个异常,因为你试图通过相同的\t进行解析,这将再次没有返回任何结果。 nn=sentence.indexOf('\t',n-1);的值将返回-1,这意味着“没有您要查找的内容的最后一个索引”。然后,您尝试获取值为-1的实际子字符串,这是一个无效的子字符串,因此您将获得异常。

答案 2 :(得分:1)

你被\t的概念弄错了,' '水平标签的转义序列,而不是空格字符(空格)。搜索{{1}}可以解决问题并找到句子中的空格。

答案 3 :(得分:1)

这看起来像是家庭作业,所以我的回答是暗示。

提示:读取String.indexOf的javadoc,注意当找不到字符串/字符时返回的值。

(事实上 - 即使这不是正式的家庭作业,你显然是一个Java初学者。初学者需要知道javadocs是使用不熟悉的方法时首先要看的地方。)

答案 4 :(得分:0)

解决这个问题的最简单方法我猜想首先使用String.split函数拆分String。像这样:

static void sentence(String snt) {
    String[] split = snt.split(" ");

    for (int i = 0; i < split.length; i++) {
        for (int j = 0; j <= i; j++) {
            if (i == 1 && j == 0) System.out.print(split[j]);
            else System.out.printf(" %s", split[j]);
        }
    }
}

正如其他人所指出的那样。您将除标签(\ t)以外的每个字符计为空格。您需要通过

检查空格
if (sentence.charAt(k) == ' ')

答案 5 :(得分:0)

  1. \t代表标签。要查找空间,只需使用' '
  2. 如果
  3. .indexOf()在字符串中找不到字符,则返回-1。所以我们一直循环,直到.indexOf()返回-1。
  4. 此处并不真正需要使用continue。当我们遇到空格时,我们会增加numSpaces
  5. 当我们想要混合文字字符串和变量时,
  6. System.out.format非常有用。不需要丑陋的+

  7. String sentence = "I need to write.";
    int len = sentence.length();
    int numSpace = 0;   
    for (int k = 0; k < len; k++) {
        if (sentence.charAt(k) == ' ') {
            numSpace++;
        }
    }
    System.out.format("Found %s in the string.\n", numSpace);
    int index = sentence.indexOf(' ');
    while(index > -1) { 
        System.out.println(sentence.substring(0, index));
        index = sentence.indexOf(' ', index + 1);
    }
    System.out.println(sentence);
    }
    

答案 6 :(得分:0)

试试这个,它应该做你想要的。我想你已经完成了这个,所以我只是让代码真正快速。阅读评论,了解代码背后的原因。

public static void main(String[] args) {   
  String sentence = "I need to write.";
  int len = sentence.length();

  String[] broken = sentence.split(" "); //Doing this instead of the counting of characters is just easier...

  /* 
   * The split method makes it where it populates the array based on either side of a " " 
   * (blank space) so at the array index of 0 would be 'I' at 1 would be "need", etc.
   */

  boolean done = false;
  int n = 0;

  while (!done)  { // While done is false do the below

    for (int i = 0; i <= n; i++) { //This prints out the below however many times the count of 'n' is.

    /*
     * The reason behind this is so that it will print just 'I' the first time when
     * 'n' is 0 (because it only prints once starting at 0, which is 'I') but when 'n' is 
     * 1 it goes through twice making it print 2 times ('I' then 'need") and so on and so 
     * forth.
     */
      System.out.print(broken[i] + " ");
    }
    System.out.println(); // Since the above method is a print this puts an '\n' (enter) moving the next prints on the next line

    n++; //Makes 'n' go up so that it is larger for the next go around

    if (n == broken.length) { //the '.length' portion says how many indexes there are in the array broken

    /* If you don't have this then the 'while' will go on forever. basically when 'n' hits
     * the same number as the amount of words in the array it stops printing.
     */
      done = true;
    }
  }
}