tags:

views:

114

answers:

2

I am new to java, and going to bite the bullet by asking what is I am sure, a dumb question. I created some methods, and simply wanted to call them in main. I am getting an error for the while loop in the main method. The compiler is saying " Exception in thread main java.lang.StringIndexOutOfBoundsException: String index out of range:0 at java.lang.String.charAt(String.java:686) at Project3.main(Project3.java:61)

Any help would be greatly appreciated. Thanks. Full Code is below:

import javax.swing.JOptionPane;
import java.util.Scanner;
public class Project3
{
public static void main(String[] args)
{
 int iScore1;  //first variable input by user to calc average
 int iScore2;  //second variable input by user to calc average
 int iScore3;  //third variable input by user to calc average
 double dAverage; //returned average from the three test scores
 char cLetterGrade; //letter grade associated with the average
 double dGPA;  //the GPA associated with the letter grade
 char cIterate = 'Y';  // loop check
 String strAgain;   //string user inputs after being asked to run again

 System.out.print(createWelcomeMessage());


 //pause in program
 pressAnyKey();

 while (cIterate == 'Y')
 {
 //prompt user for test scores
 System.out.print("\n\nPlease enter the first test score: ");
 Scanner keys = new Scanner(System.in);
 iScore1 = keys.nextInt();

 System.out.print("\nPlease enter the second test score: ");
 iScore2 = keys.nextInt();

 System.out.print("\nPlease enter the third test score: ");
 iScore3 = keys.nextInt();

 //calculate average from the three test scores
 dAverage = calcAverage(iScore1, iScore2,iScore3);
 System.out.print("\nThe average of the three scores is: " + dAverage);

 //pause in program
 pressAnyKey();

 //get letter grade associated with the average
 cLetterGrade = getLetterGrade(dAverage);
 System.out.print("\nThe letter grade associated with the average is " + cLetterGrade);

 //pause in program
 pressAnyKey();

 //get the GPA associated with the letter grade
 dPGA = calcGPA(cLetterGrade);
 System.out.print("\nThe GPA associated with the GPA is "+ dGPA);

 //pause in program
 pressAnyKey();

 System.out.print("\nDo you want to run again?(Y or N):_\b");
 strAgain = keys.nextLine;
 strAgain = strAgain.toUpperCase();
 cIterate = strAgain.charAt(0);
 }//end while

 //display ending message to user
 System.out.print(createEndingMessage());

 }//end main method
}//end class Project3

public static String createWelcomeMessage()
{
 String strWelcome;
 strWelcome = "Why hello there!\n";
 return strWelcome;
}//end createWelcomeMessage()

public static String createEndingMessage()
{
 String strSalutation;
 strSalutation = "See you later!\n";
 return strSalutation;
}//end createEndingMessage()

public static void pressAnyKey()
{
 JOptionPane.showMessageDialog(null, "Press any key to continue: ");
}//end pressAnyKey()

public static int getTestSCore()
{
 int iScore;
 System.out.print("Enter a test score: ");
 Scanner keys = new Scanner(System.in);
 iScore = keys.nextInt();
 return iScore;
}//end getTestSCore()

public static int calcAverage(int iNum1, int iNum2, int iNum3)
{
 double dAverage;
 dAverage = ((double)iNum1 + (double)iNum2 + (double)iNum3) / (double)3.0;
 return dAverage;
}//end calcAverage(int iNum1, int iNum2, int iNum3)

public static char getLetterGrade(double dGrade)
{
 char cLetter;

 if (dGrade <60)
 {
  cLetter = 'F';
 }
 else if (dGrade >=60 && dGrade <70)
 {
  cLetter = 'D';
 }
 else if (dGrade >=70 && dGrade <80)
 {
  cLetter = 'C';
 }
 else if (dGrade >=80 && dGrade <90)
 {
  cLetter = 'B';
 }
 else if (dGrade >=90)
 {
  cLetter = 'A';
 }

 return cLetter;
}//end getLetterGrade(double dGrade)

public static double calcGPA(char cLetterGrade)
{
 double dGPA;

 if (cLetterGrade == 'A')
 {
  dGPA = 4.0;
 }
 else if (cLetterGrade == 'B')
 {
  dGPA = 3.0;
 }
 else if (cLetterGrade == 'C')
 {
  dGPA = 2.0;
 }
 else if (cLetterGrade == 'D')
 {
  dGPA = 1.0;
 }
 else
 {
  dGPA = 0.0;
 }
 return dGPA;
}//end calcGPA(char cLetterGrade)
A: 

The problem is caused by this line:

cIterate = strAgain.charAt(0);

The string apparently does not have a character at index 0, in other words, it is empty. You may want to check the user input and ask again if none was supplied.

Jorn
+3  A: 

You're reading three ints using scanner.nextInt(). Since nextInt does not consume any whitespace or newline after the read token, that means that if the user enters a number and presses enter, there's still a linebreak in the stream.

So when you call nextLine later it just reads that linebreak and returns the empty string.

Since calling charAt on an empty string will cause an out of bounds error, you get the error you get.

To fix this, either use next instead of nextLine, which will read the next word (consuming any whitespace before it), instead of the next line, or call nextLine twice. Once to consume the linebreak and once to read the actual line.

You should still check whether the user enters an empty line though.

sepp2k