Posted by: MadDawg May 23 2009, 11:17 PM
I'm having a little trouble with my java application. I want it to repeat when the user enters "y" or "Y" and exit when the user enters "n" or "N". The app compiles, but when it's supposed to repeat/exit, I get this output:
QUOTE
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:687)
at If_Else2.Grade(If_Else2.java:74)
at If_Else2.main(If_Else2.java:9)
Process completed.
Here is the source code (created in JCreator LE).
CODE
//This is my first attempt at an if/else program.
import java.util.Scanner;
public class If_Else2
{
public static void main( String args[])
{
Grade();
}
public static void Grade()
{
System.out.println("*********Grade Calculation*********");
System.out.println();
Scanner input = new Scanner( System.in );
int score;
char grade;
char cont;
boolean done = false;
boolean ans = false;
while (done == false)
{
System.out.print("Enter your test score: ");
score = input.nextInt();
//Main Calculations
if (score >= 90)
{
grade = 'A';
}
else if (score >= 80)
{
grade = 'B';
}
else if (score >= 75)
{
grade = 'C';
}
else if (score >= 70)
{
grade = 'D';
}
else
{
grade = 'F';
}
//Output
System.out.println();
if (score > 9000)
{
System.out.println("YOUR SCORE IS OVER NIIIINE THOUSSSAAAAAANNNDDDDD!!!!!!!!!");
}
else if (score > 100)
{
System.out.println("You either have a good teacher, or you're a suck-up,\nbecause you are not supposed to score that high.");
}
else if (score >= 0)
{
System.out.println("You earned a(n) " +grade +" on your test.");
}
else
{
System.out.println("You must have a bad teacher, because you cannot score that low\nno matter how dumb you are.");
}
while (ans == false)
{
System.out.print("\nDo you want to enter another score? Enter \"y\" for \"yes\" or \"n\" for \"no\": ");
//cont = input.nextChar();
cont = input.nextLine().charAt(0);
//cont = charAt(0);
if (cont == 'y' || cont == 'Y')
{
done = false;
ans = true;
}
else if (cont == 'n' || cont == 'N')
{
done = true;
ans = true;
}
else
{
System.out.println("Please Enter \"y\" for \"yes\" or \"n\" for \"no\".");
}
}
System.out.println();
}
}
}
Here's the section I'm having trouble with:
CODE
while (ans == false)
{
System.out.print("\nDo you want to enter another score? Enter \"y\" for \"yes\" or \"n\" for \"no\": ");
//cont = input.nextChar();
cont = input.nextLine().charAt(0);
//cont = charAt(0);
if (cont == 'y' || cont == 'Y')
{
done = false;
ans = true;
}
else if (cont == 'n' || cont == 'N')
{
done = true;
ans = true;
}
else
{
System.out.println("Please Enter \"y\" for \"yes\" or \"n\" for \"no\".");
}
}
As you can see, I've commented out the "cont" twice as a result of trial and error.
Posted by: groovicus May 24 2009, 10:02 AM
The error is telling you that there is nothing being pointed to by cont. Are tou reading in a line from the keyboard, or are you simply reading a char?
Posted by: MadDawg May 24 2009, 10:34 AM
I want it to read a char (Y/y or N/n).
Posted by: groovicus May 24 2009, 12:39 PM
This code works fine:
CODE
import java.util.Scanner;
public class scanTest {
public static void main(String[] args) {
Scanner input = new Scanner( System.in );
System.out.println(input.nextLine().charAt(0));
}
}
You need to fire up the debugger and step through your code to try and figure out where the keyboard input is being consumed.
Posted by: MadDawg May 24 2009, 02:08 PM
It won't allow any input. The error comes up as soon as it asks whether you want to continue or not.
Posted by: MadDawg May 25 2009, 01:30 PM
Alright, well thanks for your help groovicus. I'll just program this same app in C++, since it handles letter inputs better. (IMO)
Posted by: jpshortstuff May 26 2009, 03:29 AM
The problem is that after using nextInt(), you are left with input that starts with a newline.
For example, your input will be something like this:
INT\n
CHAR\n
First, you are calling nextInt(), which will leave you with this:
\n
CHAR\n
Now you are calling nextLine(). Since the next character on the input is a newline character, the function returns immediately giving you a string with zero characters in it. You need to flush the rest of that first line away (an extra call to nextLine() should do it).