Fergus
Fergus

Reputation: 471

StringIndexOutOfBoundsException Error

I'm new to JAVA and am working on a task to:

  1. Take as input a user string
  2. Take as input a user integer
  3. Use the integer as an increment value
  4. Return all character values in the string starting from 0 ending at the last character available after incrementing.

I'm getting correct results in terminal immediately followed by the dreaded StringOutOfBoundsException error. I'm not able to see where I am attempting to access a character in the string that is out of bounds and would be grateful for your expertise locating my error. Here is a snippet of my code:

import java.util.*;
public class EveryOtherCharacter
{
   public static void main(String[] args)
   {
    Scanner input = new Scanner(System.in);    

    //initialize all variables to be used in this program
    String userEntry;//store user word as a String
    String error=("Invalid Entry!");//notify of error
    String purpose=("Enter a word and an increment value and we'll\nreturn each character in your word using the number you provided".)
    int increment;//store increment integer from user
    int userEntryCount;//store total count of chars in userEntry
    char value;//get character at increment value from userEntry

    System.out.println("========================START PROGRAM=============================");
   System.out.println(purpose); 

    System.out.println();//whitespace
    System.out.print("Enter a word: ");
    userEntry=input.nextLine();
    userEntryCount = userEntry.length();

    System.out.print("Enter an increment value:  ");
    increment=input.nextInt();
    System.out.println();//whitespace

    value=userEntry.charAt(0);
    System.out.print(value);

    for (int count=0; count <= userEntryCount; count++)
    {
        value=userEntry.charAt(increment);
        userEntry=userEntry.substring(increment);
        System.out.print(value);
    }

    if (increment > userEntryCount && increment <= 0)
    {
        System.out.println(error);
    }
     System.out.println();//whitespace

    System.out.println("=========================END PROGRAM==============================");

   }
}

Here is an example of what my terminal output looks like after running this program. Notice that the correct output is present immediately before the exception error:

java EveryOtherCharacter
========================START PROGRAM=============================
Enter a word and an increment value and we'll
return each character in your word using the number you provided

Enter a word: whyisthissohard
Enter an increment value:  3

wihsaException in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
at java.lang.String.charAt(String.java:658)
at EveryOtherCharacter.main(EveryOtherCharacter.java:57)

Upvotes: 1

Views: 444

Answers (3)

Fergus
Fergus

Reputation: 471

I ended up solving this using a while loop as follows:

while (n < length)//where n=userNumber & length=length of user word
{
    character=userEntry.charAt(n);//character becomes the character of the word at the increment value
    System.out.print(character);//print value of character at increment
    userEntry=userEntry.substring(n);//set userEntry to value of new string starting at n
    length = userEntry.length();//count the total number of characters in the new substring
}

After going through the logic of the for loop, I realized i had created and was trying to increment the value of i and that wasn't necessary. You all were a really big help in making think through the problem. I appreciate your help!

Upvotes: 0

OneCricketeer
OneCricketeer

Reputation: 192013

I think when the instructions say "Use the integer as an increment value", you should be using it as an actual increment value like so.

public static void main(String[] args) {

    String s = "whyisthissohard";
    int skip = 3;

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i += skip) { // <--- Increment value
        sb.append(s.charAt(i));
    }

    //Return all character values in the string
    System.out.println(sb.toString()); // wihsa

}

You could also print them all in the for-loop instead of adding to another string, if you want.

Upvotes: 1

Yassin Hajaj
Yassin Hajaj

Reputation: 22005

You're cutting through whyisthissohard by 3 each time. But you are looping through whyisthissohard's length in total.

for (int count=0; count <= userEntryCount; count++)
{
    value=userEntry.charAt(increment);
    userEntry=userEntry.substring(increment);
    System.out.print(value);
}

First loop : value = 'i' ; userEntry = "isthissohard" ;
Second loop : value = 'h' ; userEntry = "hissohard";
Third loop : value = 's' ; userEntry = "sohard";
Fourth loop : value = 'a' ; userEntry = "ard";
Fifth loop => Error

Upvotes: 2

Related Questions