Java-字符串索引超出范围异常“字符串索引超出范围”

时间:2010-10-24 11:33:27

标签: java exception

我是java的新手,并且通过询问我确定的是一个愚蠢的问题来咬紧牙关。我创建了一些方法,只是想在main中调用它们。我在main方法中遇到了while循环的错误。编译器在Project3main(Project3.java:61)中说“线程主java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:0,java.lang.String.charAt(String.java:686)”

非常感谢任何帮助。谢谢。完整代码如下:

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)

3 个答案:

答案 0 :(得分:5)

您正在使用scanner.nextInt()阅读三个整数。由于nextInt在读取令牌之后不消耗任何空格或换行符,这意味着如果用户输入数字并按Enter键,则流中仍有换行符。

因此,当您稍后调用nextLine时,它只会读取该换行符并返回空字符串。

由于在空字符串上调用charAt会导致越界错误,因此会出现错误。

要解决此问题,请使用next代替nextLine,这将读取下一个字(消耗之前的任何空格),而不是下一行,或者调用nextLine两次。一次消耗换行符,一次读取实际行。

您仍应检查用户是否输入空行。

答案 1 :(得分:0)

问题是由这一行引起的:

cIterate = strAgain.charAt(0);

字符串显然在索引0处没有字符,换句话说,它是空的。 您可能需要检查用户输入并再次询问是否提供了用户输入。

答案 2 :(得分:-1)

如果您移动第67行左右,它就是结束课程的行。将它移到最后,这会导致三个错误。这三个错误中的一个是拼写错误,一个关于keys.nextLine需要() - &gt; keys.nextLine()和最后一个错误是方法头返回一个int,而不是一个double。执行此操作会产生另一个错误,但如果您将cLetter设置为单引号中的空格,&#39; &#39;然后代码编译。