StringIndexOutOfBoundsException: string index out of range - java

I can't find an answer about this exception. THe program is very simple but, i don't know why is incorrect.
/**
* Program selects the first word from the sentence "Hello, my dear!" with
* the String Classes's methods this.indexOf() and this.substring()
*
*
* Last modify: 29th October 2015
*/
public class TakeSubstringWanted {
public static void main(String[] args) {
String sentence = "Hello, my dear!";
String reference = "Hello";
System.out.println("The sentence is: " + sentence);
System.out.println("You want to take the first word of that sentence");
System.out.println("Give me a second...");
int firstReference = sentence.indexOf(reference);
int firstLength = reference.length();
System.out.println("The first reference of the searched word is " + firstReference);
System.out.println("The first word of the sentence " + sentence + " is: " + "\"" + sentence.substring(firstReference, firstLength) + "\"");
int secondReference = sentence.indexOf("my");
System.out.println("The second reference of the searched word is " + secondReference);
int secondLength = "my".length();
System.out.println(secondLength);
System.out.println(sentence);
System.out.println("The second word of the sentence " + sentence + " is: " + "\"" + sentence.substring(secondReference, secondLength) + "\"");
}
}

Your problem is in the last line:
System.out.println("The second word of the sentence " + sentence + " is: "
+ "\"" + sentence.substring(secondReference, secondLength) + "\"");
because your secondReference = 7 and secondLength = 2, however if you look at the documentation for substring method:
public String substring(int beginIndex,
int endIndex)
Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.
...
Throws:
IndexOutOfBoundsException - if beginIndex or endIndex are negative, if endIndex is greater than length(), or if beginIndex is greater than startIndex
Meaning, you're asking substring to return a string from index 7 to index 2, which causes an IndexOutOfBoundsException. What you probably meant to do was:
sentence.substring(secondReference, secondReference + secondLength)

Your Problem is here:
sentence.substring(secondReference, secondLength)
Your giving to lengths but it should be
sentence.substring(startIndex, endIndex);
Hope that helps!

your last substring starts at pos 7 and the end index is 2, which is not possible. The last index is the end index, not the length of the char you like to take
sentence.substring(secondReference, seconfReference+secondLength);
would it be then

The second parameter of substring is the end index, not the number of characters to take.
sentence.substring(secondReference, secondLength)
When you run this, secondLength is 2 (the length of "my"), but secondReference is 7, greater than 2, resulting in such an exception.
If you want those two characters, you'd need to use:
sentence.substring(secondReference, secondLength+secondReference)

when you are using sentence.substring() for second time the second parameter of substring method should be greater than first parameter..in your case the first parameter is 7 and second parameter is 2 ...thats why you are getting String index out of range: -5

Instead of giving the length, you have to give the end index. The substring method works like:
substring(int beginIndex, int endIndex)
Change
int firstLength = reference.length();
int secondLength = "my".length();
to
int firstLength = sentence.indexOf(",");
int secondLength = sentence.indexOf(" dear");
Try this:
String sentence = "Hello, my dear!";
String reference = "Hello";
System.out.println("The sentence is: " + sentence);
System.out.println("You want to take the first word of that sentence");
System.out.println("Give me a second...");
int firstReference = sentence.indexOf(reference);
int firstLength = sentence.indexOf(",");
System.out.println("The first reference of the searched word is " + firstReference);
System.out.println("The first word of the sentence " + sentence + " is: " + "\"" + sentence.substring(firstReference, firstLength) + "\"");
int secondReference = sentence.indexOf("my");
System.out.println("The second reference of the searched word is " + secondReference);
int secondLength = sentence.indexOf(" dear");
System.out.println(secondLength);
System.out.println(sentence);
System.out.println("The second word of the sentence " + sentence + " is: " + "\"" + sentence.substring(secondReference, secondLength) + "\"");

Related

Why my indexOf value is not returning the right result?

I am writing this little section for a program I'm gonna write for initials of a name in java, and I need to determine the position of each space in it to be able to choose the initials. I'm testing it to make sure the spaces are been seen in the right position in the line, but for some reason, the position always comes wrong! Please help me.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("please enter full name:");
String name = in.nextLine();
int space = name.indexOf(" ");
int space1 = name.indexOf(" ", space) + space+1;
int space2 = name.indexOf(" ", space1) + space1+1;
int space3 = name.indexOf(" ", space2) + space2+1;
int space4 = name.indexOf(" ", space3) + space3+1;
int space5 = name.indexOf(" ", space4) + space4+1;
System.out.println(space + " " + space1 + " " + space2 + " " + space3 + " " + space4);
}
}
My idea using this line was to count up to each part of the line space that shows up after the last one and add 1 because java starts counting at 0.
(" ", space1) + space1+1;
Basically, if the name is "Jeff Luiz Jeff Luiz" the first space is at 4 and the next one is at 9, so it would the 4, then proceed to count after this space, starting at 0, which would find 4 again(because Luiz has the same amount of letters), sum up with the last space number to keep track of the real position(then it would be 8), and finally sum up with 1 because of how java works, and so on. When I ran these 4 words I found the result 4 9 19 19 19. Does anyone know what is the problem with my code?
Replace
int space1 = name.indexOf(" ", space) + space+1;
with
int space1 = name.indexOf(" ", space + 1);
because String#indexOf(String str, int fromIndex) returns the index within this string of the first occurrence of the specified substring, starting at the specified index.
Demo:
public class Main {
public static void main(String[] args) {
String name = "Arvind Kumar Avinash";
int space = name.indexOf(" ");
int space1 = name.indexOf(" ", space + 1);
System.out.println(space + ", " + space1);
}
}
Output:
6, 12

how to delete empty line and rest of the character in java

I want to delete empty line and rest of the character from my string, I would like to parse particular value alone from the string.
I want this value alone 23243232 from my string, after product price I've have empty line space and again I've some character so I'm using that empty line as delimiter and trying to get product price alone. But I'm getting other values also along with 23243232. Can someone help me to get only 23243232 from this string
String actualResponse = "--sGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArwzoF_yDmmW5DfupJDtuHlh20LL2SAbWZb8a3exzoF_yDmmW5DfupJDtuHlh20LL2SAbWZb8a3exsGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArw\r\n"
+ "Product-Discription: form-name; productName=\"iPhone\"\r\n" + "Product-Type: Mobile\r\n"
+ "Product-Price: 23243232\r\n" + "\r\n" + "%dsafdfw32.323efaeed\r\n" + "#$#####";
String productPrice = actualResponse.substring(actualResponse.lastIndexOf("Product-Price:") + 15);
System.out.println("Printing product price ..." + productPrice);
String finalString = productPrice.replaceAll(" .*", "");
This is the output I'm getting:
Printing product price ...23243232
%dsafdfw32.323efaeed
#$#####
But I want only 23243232 - this value alone.
Apply Regular Expression for more flexibility.
String content = "--sGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArwzoF_yDmmW5DfupJDtuHlh20LL2SAbWZb8a3exzoF_yDmmW5DfupJDtuHlh20LL2SAbWZb8a3exsGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArw\r\n"
+ "Product-Discription: form-name; productName=\"iPhone\"\r\n" + "Product-Type: Mobile\r\n"
+ "Product-Price: 23243232\r\n" + "\r\n" + "%dsafdfw32.323efaeed\r\n" + "#$#####";
String re1 = "\\bProduct-Price:\\s"; // Word 1
String re2 = "(\\d+)"; // Integer Number 1
Pattern p = Pattern.compile(re1 + re2, Pattern.DOTALL);
Matcher m = p.matcher(content);
while (m.find()) {
for (int i = 0; i <= m.groupCount(); i++) {
System.out.println(String.format("Group=%d | Value=%s",i, m.group(i)));
}
}
It will print out:
Group=0 | Value=Product-Price: 23243232
Group=1 | Value=23243232
first solution came in my mind. its not the best but will solve your problem.
StringBuilder finalString =new StringBuilder();
for (Character c : productPrice.toCharArray()) {
if(Character.isDigit(c)){
finalString.append(c);
}else{
break;
}
}
This is because you are printing the entire sub-string right from index: actualResponse.lastIndexOf("Product-Price:") + 15 to the end of the string.
You need to provide the end index too as a second parameter in substring method.
You need to use this:
int start = actualResponse.lastIndexOf("Product-Price:") + 15;
int end = actualResponse.indexOf("\r\n", start); // The first "\r\n" from the index `start`
String productPrice = actualResponse.substring(start, end);
This will give your final ans...
String actualResponse ="--sGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArwzoF_yDmmW5DfupJDtuHlh20LL2SAbWZb8a3exzoF_y DmmW5DfupJDtuHlh20LL2SAbWZb8a3exsGEFoZV85Qnkco_QAU5b6B3Tt1OrOOFkArw\r\n"
+ "Product-Discription: form-name; productName=\"iPhone\"\r\n" + "Product-Type: Mobile\r\n"
+ "Product-Price: 23243232\r\n" + "\r\n" + "%dsafdfw32.323efaeed\r\n" + "#$#####";
String productPrice = actualResponse.substring(actualResponse.lastIndexOf("Product-Price:") + 15);
System.out.println("Printing content lenght..." + productPrice.split("\r\n")[0]);

What's Wrong? Number Of Words In a Sentence Java

int numOfWords = str.length() - str.replace(" ", "").length();
Why does that not work? If str is equal to "Hello bye", numOfWords should equal 2, but when ran numOfWords equals 0. Any help would be greatly appreciated!
You are only replacing one blank, so the output will be 1 (at least this is what is produce in my JVM)
If you want to know the number of words then either add 1 to this number or use
str.split(" ").length;
Why dont you use :
int numOfWords = str.split(" ").length;
I hope out put is much clear
public static void main(String[] args) {
String str = "Hello bye";
System.out.println("Length of Input String = " + str.length() + " for String = " + str);
System.out.println("Length of Input String with space removed = " + str.replace(" ", "").length() + " for String = "
+ str.replace(" ", ""));
int numOfWords = str.length() - str.replace(" ", "").length();
System.out.println(numOfWords);
}
Output
Length of Input String = 9 for String = Hello bye
Length of Input String with space removed = 8 for String = Hellobye
1

Beginner Programmer: Java String Manipulation

Can someone tell me what I am doing wrong here? I'm trying to display the position of asterisks but i keep getting 1 in return.
package proj2;
import java.util.Scanner;
/**
* <p> Title: Project 2: String Manipulation </p>
* <p> Description: Ask the user to enter a URL and it will display
* the protocol, domain name and file name specified. </p>
* #author Mario Mendoza
*
*/
public class Project2 {
/**
*
* #param args arguments
*/
public static void main(String[] args ) {
Scanner s = new Scanner(System.in );
String sentence;
String word1;
String word2;
String word3;
String word4;
String asterisks1 = "*";
String asterisks2 = "*";
String asterisks3 = "*";
int firstWord;
int secondWord;
int thirdWord;
int fouthWord;
int wordLength1;
int wordLength2;
int wordLength3;
int wordLength4;
int positionOfAsterisks1;
int positionOfAsterisks2;
int positionOfAsterisks3;
char firstLetter;
int total;
word1 = s.next();
word2 = s.next();
word3 = s.next();
word4 = s.next();
System.out.println("You typed " + word1 + asterisks1 + word2 + asterisks2 + word3 + asterisks3 + word4);
sentence = new String(word1 + asterisks1 + word2 + asterisks2 + word3 + asterisks3 + word4);
wordLength1 = word1.length();
System.out.println(word1 + " has length " + wordLength1);
wordLength2 = word2.length();
System.out.println(word2 + " has length " + wordLength2);
wordLength3 = word3.length();
System.out.println(word3 + " has length " + wordLength3);
wordLength4 = word4.length();
System.out.println(word4 + " has length " + wordLength4);
positionOfAsterisks1 = sentence.indexOf(asterisks1);
positionOfAsterisks2 = sentence.indexOf(asterisks2);
positionOfAsterisks3 = sentence.indexOf(asterisks3);
System.out.println("The asterisks were found at position " + positionOfAsterisks1 + ", " + positionOfAsterisks2 + ", and " + positionOfAsterisks3);
}
}
Have your program perform the following tasks:
Prompt the user to enter a String containing exactly four words, separated only
by asterisks. The input string should not have any spaces. An example of the kind
of input this program will receive is I*love*computer*science. Display the
user’s input (as a confirmation to the user that the program understood the input).
Store each of the four words separately.
Display each word with its length. For example:
I has length 1.
love has length 4.
computer has length 8.
science has length 7.
Display the position of the asterisks in the original string. For example:
The asterisks were found at positions 1, 6, and 15.
Display the last letter of the first word.
Display the total aggregate length of the four words.
In addition, be sure to include a JavaDoc comment at the top of the file, that include’s the
program’s title, description, and author’s name.
4 Sample Run
You typed I*love*computer*science.
I has length 1.
love has length 4.
computer has length 8.
science has length 7.
The asterisks were found at positions 1, 6, and 15.
The last letter of the first word is I.
The total aggregate length of the four words is 20 letters.
public static void main(String[] args ) {
Scanner s = new Scanner(System.in );
String sentence;
String word1;
String word2;
String word3;
String word4;
word1 = s.next();
word2 = s.next();
word3 = s.next();
word4 = s.next();
System.out.println("You typed " + word1 + "*" + word2 + "*" + word3 + "*" + word4);
sentence = new String(word1 + "*" + word2 + "*" + word3 + "*" + word4);
System.out.println(word1 + " has length " + word1.length());
System.out.println(word2 + " has length " + word2.length());
System.out.println(word3 + " has length " + word3.length());
System.out.println(word4 + " has length " + word4.length());
System.out.print("The asterisks were found at position ");
// get the position of * and store the position index
int i = 0;
String positionOfAsterisks = "";
while (i < sentence.length()){
if (sentence.charAt(i) == '*')
positionOfAsterisks += i + ", ";
i++;
}
// remove the last comma and empty space then add in full stop
positionOfAsterisks = positionOfAsterisks.substring(0, positionOfAsterisks.length()-2);
positionOfAsterisks += "." ;
System.out.print(positionOfAsterisks);
}
Instead of using indexOf, I use a loop to iterate through your 'sentence'. Also, I removed the declaration of useless variables.
IndexOf will return just the index it found from the first index (if it's not stated in the 2nd arg of the method). And IndexOf method return the first position as 1 instead of 0.
The problem is that you are always searching in the given string for the same value, which is *. It doesn't matter what you name the variable, you are essentially running this line 3 times:
positionOfAsterisks1 = sentence.indexOf('*'); using 3 different variables, but each time it will always return 1. This is because each time it starts over, hits the first asterisk, and returns true.
What you need to do is make use of the second argument, which is the position to start from.
positionOfAsterisks1 = sentence.indexOf(asterisks1);
int temp = positionOfAsterisks1 + 1;
positionOfAsterisks2 = sentence.indexOf(asterisks1,temp);
temp = positionOfAsterisks2 + 1;
positionOfAsterisks3 = sentence.indexOf(asterisks1,temp);
What this does
The first line returns a value of 1. The next line sets temp to 2. Now the search starts from the third position (since array indices start at 0), and will thus not include the first asterisk. It will then hit the 7th character which is * and return 6. Again temp is set to 7, and again the search starts from the 8th character, and goes on till it hits the asterisk again at 15.
Note
You do not need to use 3 separate variables to hold the same *, it is only a waste of space. I would recommend using the same variable and eliminating the other two!

Why do I get this java.lang.StringIndexOutOfBoundsException error in running this program?

String fullWord;
String firstWord;
String secondWord;
String thirdWord;
String fourthWord;
int firstPositionOfAsterisk;
int secondPositionOfAsterisk;
int thirdPositionOfAsterisk;
int fullWordCharacters;
int firstWordCharacters;
int secondWordCharacters;
int thirdWordCharacters;
int fourthWordCharacters;
char lastLetterFirstWord;
// I will prompt the user to enter four words seperated by a *
fullWord = JOptionPane.showInputDialog("Please enter four words: ");
// I will use the position of the * to make things easier
firstPositionOfAsterisk = fullWord.indexOf("*");
firstWord = fullWord.substring(0, firstPositionOfAsterisk);
secondPositionOfAsterisk = firstWord.indexOf("*");
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
thirdPositionOfAsterisk = secondWord.indexOf("*");
thirdWord = fullWord.substring(secondPositionOfAsterisk + 1, thirdPositionOfAsterisk);
fourthWord = fullWord.substring(thirdPositionOfAsterisk + 1);
firstWordCharacters = firstWord.length();
System.out.println(firstWord +" has a length of " + firstWordCharacters + " characters" );
secondWordCharacters = secondWord.length();
System.out.println(secondWord +" has length of " + secondWordCharacters + " characters" );
thirdWordCharacters = thirdWord.length();
System.out.println(thirdWord +" has length of " + thirdWordCharacters + " characters" );
fourthWordCharacters = fourthWord.length();
System.out.println(fourthWord +" has length of " + fourthWordCharacters + " characters" );
lastLetterFirstWord = firstWord.charAt(firstPositionOfAsterisk - 1);
System.out.println("The last letter of " + firstWord + "is " + lastLetterFirstWord);
fullWord = firstWord + secondWord + thirdWord + fourthWord;
fullWordCharacters = fullWord.length();
System.out.println(firstWord +", " + secondWord + ", " + thirdWord + ", " + fourthWord + "has length of" + fullWordCharacters);
I'm trying to get the user to enter 4 words seperated by an "*" for example She*will*call*back and I want an output like like this
She has length 3
will has length 4
call has length 4
back has length 4
The * symbols were found at positions: 3, 8, and 13
The last character of she is s
The length of She, will, call, and back is 15
But I keep getting this java.lang.StringIndexOutOfBoundsException error. How do I fix this?
This line crashes the program
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
Simple.. read this.. String.substring(int, int)
And you'll see that
throws
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.
the important part is or beginIndex is larger than endIndex
probably your secondPositionOfAsterisk is getting a negative (-1) value
firstWord = fullWord.substring(0, firstPositionOfAsterisk);
The above takes the first part of the string up to the first asterisk, thus it won't contain an asterisk. So this will return -1:
secondPositionOfAsterisk = firstWord.indexOf("*");
Then this will fail: (because -1 is not a valid index)
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
I think this:
secondPositionOfAsterisk = firstWord.indexOf("*");
should be
int offset = firstWord.length()+1;
secondPositionOfAsterisk = firstWord.indexOf("*", offset);
or something like that.
Personally I think String#split is a way better option.

Categories