【问题标题】:Why aren't the array values carrying over in switch cases?为什么数组值不能在 switch case 中继承?
【发布时间】:2015-11-25 06:07:00
【问题描述】:

为什么我的开关函数中没有保存数组值? 首先,我按下 1,创建了我的花名册值。创建值后,按 2 会导致 ArrayOutOfBound 错误。谁能告诉我我做错了什么?

请忽略 FileNotFoundExceptions。在我解决了我做错的事情之后,需要在这部分工作。

public static Scanner keyboard = new Scanner(System.in);
public static int numStudents;
public static String[] nameOfStudent;
public static int[] broncoID;
public static int[] grade;

^ 这些是我声明的变量

public static void main(String[] args) throws FileNotFoundException {

    startMenus(keyboard);
}

public static void startMenus(Scanner sc) throws FileNotFoundException {
    while (true) {
        System.out.println("(Enter option # and press ENTER)\n");
        System.out.println("1. Create new Roster");
        System.out.println("2. Display Current Roster");

        int option = sc.nextInt();

        sc.nextLine();

        switch (option) {
        case 1:
            createRoster();
            break;
        case 2:
            displayRoster();
            break;
        default:
            System.out.println("Unrecognized Option!\n");
        }
    }
}

public static void createRoster() throws FileNotFoundException {

    System.out.println("Please list how many students there are.");

    numStudents = keyboard.nextInt();

    nameOfStudent = new String[numStudents];
    broncoID = new int[numStudents];
    grade = new int[numStudents];

    keyboard.nextLine();

    for(int i = 0; i < numStudents; i++){
        System.out.println("Please enter full name of Student.");
        nameOfStudent[i] = keyboard.nextLine();
        System.out.println("Now please enter the BroncoID of Student.");
        broncoID[i] = keyboard.nextInt();
        System.out.println("Now please enter grade of Student (0-100)");
        grade[i] = keyboard.nextInt();
        keyboard.nextLine();
    }
    System.out.println("Roster successfully created!");
    for (int i = 0; i < numStudents ; i++){
        System.out.printf("Name: %9s\t Bronco ID: %5d \t Grade: %2d \n", nameOfStudent[i], broncoID[i], grade[i]);
    }
}

public static void displayRoster(){
    System.out.printf("Name: %9s\t Bronco ID: %5d \t Grade: %2d \n", nameOfStudent[1], broncoID[1], grade[1]);

}

第一种情况下的 printf 有效,但在第二种情况下无效。我得到的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Roster.displayRoster(Roster.java:115)
at Roster.startMenus(Roster.java:36)
at Roster.main(Roster.java:16)

【问题讨论】:

  • 您在哪一行出现错误?
  • 为什么你的开关盒中没有case 4
  • 在您的代码中,您在位置 0 处添加 nameOfStudent、broncoID 和成绩数组中的记录,因为数组从 0 位置开始,而在 displayRoster 方法中您从数组的 1 位置检索,因此导致异常.

标签: java arrays global-variables


【解决方案1】:

数组总是从索引 0 开始。您在数组中添加了一个“名册”。此名册将获得索引 0。在您的 displayRoster() 方法中,您想显示索引 1,但您的数组只有索引 0。因此它将获得 ArrayIndexOutOfBoundsException。

代替:

System.out.printf("Name: %9s\t Bronco ID: %5d \t Grade: %2d \n", nameOfStudent[1], broncoID[1], grade[1]);

试试:

System.out.printf("Name: %9s\t Bronco ID: %5d \t Grade: %2d \n", nameOfStudent[0], broncoID[0], grade[0]);

【讨论】:

  • 这一定是答案。
【解决方案2】:

您在 switch 语句中使用了 2 个案例:

案例 1 和 2

但是,您将输入作为 1 用于 createroster 和 4 用于 displayroster

在 switch 语句中使用“case 1”和“case 4”。 或使用:

System.out.println("1. Create new Roster");
System.out.println("2. Display Current Roster");

【讨论】:

  • Err 我忘了在问题中解决这个问题,案例编号正确但问题仍然存在
  • 显示列表中出现错误,您也可以分享该代码吗?
  • 好吧.. 在 displayroster 方法中:您正在显示 nameOfStudent[1]、broncoID[1]、grade[1].... 可能它们的大小为 1.. 尝试 nameOfStudent[0] , broncoID[0], Grade[0].., 如果我没记错的话
  • 数组从 0 索引而不是 1 开始。
【解决方案3】:
  1. 最好将方法displayRoster修改为:

    public static void displayRoster() {
        System.out.println("Enter the record number to be displayed[1 to numStudents :");
        int i = keyboard.nextInt();
        if(i <= nameOfStudent.length)
            System.out.printf("Name: %9s\t Bronco ID: %5d \t Grade: %2d \n", nameOfStudent[i-1], broncoID[i-1], grade[i-1]);
        else
            System.out.println("This is where you are trying to access element out of bound.");
    }
    
  2. 输入 option = 4 指向代码中的 default 开关盒,它应该 S.out "Unrecognized Option!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多