java-设置学生和储物柜数量的问题

时间:2018-11-26 06:55:24

标签: java

我正在尝试解决典型的储物柜问题的java问题:

这里有n个储物柜和n个学生,所有储物柜都已关闭。当学生进入时,表示为S1的第一个学生将打开每个储物柜。然后,第二个学生S2从第二个储物柜(表示为L2)开始,然后关闭所有其他储物柜。 (如果打开则将其关闭,如果关闭则将其打开)。依此类推,直到学生Sn更改Ln。

import java.util.Scanner;
public class Main {
    static Scanner sc=new Scanner(System.in);
    public static void main(String[] args) {

        int testcase = sc.nextInt();
        int students = sc.nextInt();
        boolean[] a = new boolean[students];
        for (int i = 0; i < students; i++)
            a[i] = false;

        int[] x = new int[testcase];
        for (int i = 0; i < testcase; i++)
            x[i] = sc.nextInt();
        for (int i = 0; i < students; i++) {
            for (int j = 1; j < students + 1; j++) {
                if((i + 1) * j <= students) {
                    a[(i + 1) * j - 1] =! a[(i + 1) * j - 1];
                }
            }
        }
        for (int i = 0; i < testcase; i++) {
            if (a[x[i] - 1] == false)
                System.out.println("close");
            else
                System.out.println("open");
        }
    }
}

这是我编写的代码,并假设 在显示第一个输入的输出(例如10 4)后,测试用例大于1,发生以下错误,但不显示第二个输出: 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:999     在Main.main(Main.java:23)

有人可以解释为什么会出现这种错误吗?谢谢!

1 个答案:

答案 0 :(得分:0)

当您尝试访问不存在的数组的索引时,发生ArrayIndexOutOfBoundsException。例如:

int[] numbers = new int[] {1, 2, 3, 4, 5};

数组中有五个数字,它们的索引从0到4。如果尝试访问不存在的索引5,将发生ArrayIndexOutOfBoundsException。也就是说,当您这样做时:

System.out.println("The sixth number in the array is :" + numbers[5]);

您正在通过计数器变量(i)访问索引,该计数器变量可能大于数组的现有索引。

由于您的问题中发现了错误消息,我怀疑以下行会导致ArrayIndexOutOfBoundsException线程“ main”中的异常java.lang.ArrayIndexOutOfBoundsException:Main.main上的999( Main.java:23):

if (a[x[i] - 1] == false) // at least, this is the 23rd line in the question code

您需要i的值,因为它可能大于x的最大索引,并且如果有效,请检查x[i] - 1,该值可能会超过{{ 1}}。

请注意,每个值a也会引起一个< 0,因为索引从ArrayIndexOutOfBoundsException开始,并且永远不能小于该值。