最近,在编码时我遇到了以下错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 0
at java.lang.String.charAt(String.java:686)
at TestAssign2.main(TestAssign2.java:119)
当我向代码添加行firstLetter=userName.charAt(0);
时出现错误,程序在用户输入所有要求的值后显示错误消息。在输入这一行之前,一切正常。
while(uProgStart.equals(PROGSTART))
{
System.out.println("What is your name?");
userName=sc.nextLine();
junk = sc.nextLine();
System.out.println("What is the year of your birth?");
birthYear = sc.nextInt();
junk = sc.nextLine();
System.out.println("What is the date of your birth? (dd.mm)");
birthDDMM = sc.nextDouble();
junk = sc.nextLine();
day=(int)birthDDMM;
month=(int)Math.round(100*birthDDMM)%100;
//Begins calculation of Dss Score
if(birthYear%CYCLE_LENGTH!=SNAKE_YEAR)
{
DssScore=DssScore+1;
}
if(month<SPRING_BEGINNING||month>SPRING_END)
{
DssScore=DssScore+2;
}
firstLetter=userName.charAt(0);
if(firstLetter==(LOWER_S)||firstLetter==(UPPER_S))
{
DssScore=DssScore+4;
}
该行的想法是查看用户输入的名称是以字母“s”还是“S”开头。
所有变量都已声明,我只是为了保持这篇文章的简洁而没有包含它们。
答案 0 :(得分:1)
我认为您在没有机会输入任何输入的情况下错误地按下了输入键,并强制用户名变量为空。我像上面提到的那样重现了这个错误。有时当你处理scanner
时,就会发生这种情况。
因此,在您的代码中,在执行任何操作之前检查username
是否为空。
答案 1 :(得分:0)
调用sc.nextLine()
以便在charAt调用之前分配userName
可能会返回一个空字符串(例如,如果您扫描一个空行)。
答案 2 :(得分:0)
您可能希望使用if
来确保下一行确实存在。
这样的事情:
if(sc.hasNextLine()) {
userName = sc.nextLine()
} else {
System.out.println("OMG... Where is my line?")
}
这很可能不是解决问题的好方法,但根据我们提供的有限信息,很难提出更好的建议。
真正的问题很可能是你逻辑中的其他地方。