我正在尝试解决典型的储物柜问题的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)
有人可以解释为什么会出现这种错误吗?谢谢!
答案 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
开始,并且永远不能小于该值。