Java:数组索引超出界限例外
System.out.print("Enter an integer: "); Scanner sc = new Scanner(System.in); int x = sc.nextInt(); int lArray = x - 2; int[] newArray = new int[lArray]; System.out.println("Let's display all possible integers..."); for (int i = 0; i <= newArray.length; i++) { newArray[i] = i + 2; System.out.print(newArray[i] + " "); }
我刚刚开始使用Java,但是我确定,如果我用另一种语言编写类似的代码,我将面临同样的问题。 这是一个应用程序的摘录,它列出了所有素数,直到用户input。
之所以用x-2作为lArray的定义是因为数组的长度将是从2到数字{2,3,4,5 … x}的所有整数。
我注意到了这一行
for (int i = 0; i <= newArray.length; i++) {
如果我将i <= newArray
更改为i < newArray
,则代码将正常工作。 但是,如果x是素数,那么用户的inputx就不存在了,这是一个问题。
你应该使用<
而不是<=
在:
for (int i = 0; i <= newArray.length; i++) ^^
如果使用任何数组, foo
有效索引是[0,foo.length-1]
使用foo.length
作为索引将导致ArrayIndexOutofBoundsException
。
还有lArray
,其中包含自然数<=x
数字,但不包括一个数字1
,其值应该是x-1
而不是x-2
。
改为将数组长度改为(x - 1)
,并使用已经find的<
条件,以避免出界exception。
你需要一个比你当前使用的数组大1个元素的原因是因为有(n - 1)
候选者必须被考虑在2和n之间,而不是(n - 2)
。
例如,有两个候选人less于或等于三个(2和3),这两个恰巧恰好是质数。
for (int i = 0; i <= newArray.length; i++) //should be <, not <= for (int i = 0; i < newArray.length; i++)
你需要使用:
int lArray = x - 1;
并改变你的条件使用<
而不是<=
。
在C / C ++的Java中,数组是基于ZERO的。 所以你的N值数组将从索引0到N-1 。
以你为例: {2, 3, 4, 5... x}
。
您将需要N-1
值来存储所有正数,但是1个整数数组中。 所以,如果N
等于4 ,你的数组将是:
newArray[0] = 2; newArray[1] = 3; newArray[2] = 4;
因此,数组长度必须是3 ( N-1 )。