开发者

Why am I getting java.lang.StringIndexOutOfBoundsException?

I want to write a program that prints words incrementally until a complete sentence appears. For example : I need to write (input), and output:

I

I need

I need to

I need to write.

Here is my code:

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));
   }
}

and this is what I get:

I need 开发者_开发知识库to write.

16

Found 0 in the string.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:

String index out of range: -1 at

java.lang.String.substring(String.java:1937) at

split1.Split1.main(Split1.java:36) Java Result: 1 BUILD SUCCESSFUL

(total time: 0 seconds)

I don't understand why numSpace doesn't count the occurrences of spaces, nor why I don't get the correct output (even if I replace numSpace by 3 for example).


  1. You don't have a \t character, so indexOf(..) returns -1
  2. You try a substring from 0 to -1 - fails

The solution is to check:

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


Your loop looking for numSpace is incorrect. You are looking for a \t which is a tab character, of which there are none in the string.

Further, when you loop in the bottom, you get an exception because you are trying to parse by that same\t, which will again return no results. The value of n in n=sentence.indexOf('\t',n-1); is going to return -1 which means "there is not last index of what you are looking for". Then you try to get an actual substring with the value of -1 which is an invalid substring, so you get an exception.


You are mistaken by the concept of \t which is an escape sequence for a horizontal tab and not for a whitespace character (space). Searching for ' ' would do the trick and find the whitespaces in your sentence.


This looks like homework, so my answer is a hint.

Hint: read the javadoc for String.indexOf paying attention to what it says about the value returned when the string / character is not found.

(In fact - even if this is not formal homework, you are clearly a Java beginner. And beginners need to learn that the javadocs are the first place to look when using an unfamiliar method.)


The easiest way to solve this I guess would be to split the String first by using the function String.split. Something like this:

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]);
        }
    }
}

As other people pointed out. You are counting every characters except tabs(\t) as a space. You need to check for spaces by

if (sentence.charAt(k) == ' ')


  1. \t represents a tab. To look for a space, just use ' '.
  2. .indexOf() returns -1 if it can't find a character in the string. So we keep looping until .indexOf() returns -1.
  3. Use of continue wasn't really needed here. We increment numSpaces when we encounter a space.
  4. System.out.format is useful when we want to mix literal strings and variables. No ugly +s needed.

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);
}


Try this, it should pretty much do what you want. I figure you have already finished this so I just made the code real fast. Read the comments for the reasons behind the code.

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;
    }
  }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜