Java字符串索引超出范围:0

时间:2013-08-21 18:04:59

标签: java string exception

我遇到这个问题,只要我输入第一个输入程序,程序崩溃就会出现

  

字符串索引超出范围:0

我看了别处并试图找到我的错误,但我发现了不同的问题,而不是我的问题。有人可以告诉我哪里出错了吗?。

感谢您的帮助,以下是代码:

import java.util.Scanner;

public class Assignment1Q2 {

    public static void main(String[] args) {

        System.out.println("Thank you for your call,\nPlease take some time to answer a few questions");
        collectData();

    }//end of main

    public static void collectData() {

        Scanner userInput = new Scanner(System.in);

        int age;
        char gender;
        char show;
        int over30MY = 0, over30FY = 0, under30MY = 0, under30FY = 0;
        int over30MN = 0, over30FN = 0, under30MN = 0, under30FN = 0;

        System.out.println("\nWhat is your age?\n");
        age = userInput.nextInt();

        System.out.println("Male or Female (Enter M or Y)");
        gender = userInput.nextLine().charAt(0);
        gender = Character.toLowerCase(gender);

        System.out.println("Do you watch the show regularly? (Enter Y or N)");
        show = userInput.nextLine().charAt(0);
        show = Character.toLowerCase(show);

        if((age > 30) && (gender == 'm') && (show == 'y')) {       
            over30MY++;             
        }
        else if((age > 30) && (gender == 'f') && (show == 'y')) {
            over30FY++;
        }
        else if((age < 30) && (gender == 'm') && (show == 'y')) {
            under30MY++;
        }
        else if((age < 30) && (gender == 'f') && (show == 'y')) {
            under30FY++;
        }
        else if((age > 30) && (gender == 'm') && (show == 'n')) {
            over30MN++;
        }
        else if((age > 30) && (gender == 'f') && (show == 'n')) {
            over30FN++;
        }
        else if((age < 30) && (gender == 'm') && (show == 'n')) {
            under30MN++;
        }
        else if((age < 30) && (gender == 'f') && (show == 'n')) {
            under30FN++;
        }//end of if else

    }//end of collectData
}// end of class

2 个答案:

答案 0 :(得分:12)

你的问题在这一行:

userInput.nextLine().charAt(0);

nextLine()方法扫描当前行上的所有内容,然后将指针推进该行。因此,当您调用charAt()方法时,您将在下一行(即空格)上调用它,因此发生错误。

相反,请将此行更改为:

userInput.next().charAt(0)

注意,这意味着您的代码的其他部分也需要更改。

修改:

即将编辑我的解决方案,但是@ Marc-Andre添加了他的答案,所以只要把它盯上它。

答案 1 :(得分:7)

当您执行age = userInput.nextInt();时遇到的问题是,您可能输入一个数字4,然后按Enter键。

因此,当您呼叫nextInt时扫描程序会读取4,但新行不会消耗。这意味着,当您执行:userInput.nextLine().charAt(0);时,您正在使用新行,因此nextLine()将返回一个空字符串。由于你在空字符串上执行chartAt,它会给你一个异常。

你可以这样做:

age = userInput.nextInt();
userInput.nextLine();

这将消耗新行,因此流应为空。所以你不会有例外,你可以要求下一个输入。