Java:数组索引超出界限异常

时间:2010-10-16 23:24:44

标签: 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,但我确信如果我用其他语言编写类似的代码,我会面临同样的问题。这是一个应用程序的摘录,它列出了用户输入之前的所有素数。

将x-2用作lArray的定义的原因是因为数组的长度将是从2到数字{2,3,4,5 ... x}的所有整数。

我注意到了这行

for (int i = 0; i <= newArray.length; i++) {

如果我将i <= newArray更改为i < newArray,则代码可以正常运行。但是,如果x为素数,则省略用户的输入x,这是一个问题。

4 个答案:

答案 0 :(得分:6)

您应该使用<而不是<=

for (int i = 0; i <= newArray.length; i++)
                  ^^

如果foo任何数组,foo的有效索引为[0,foo.length-1]

使用foo.length作为索引会导致ArrayIndexOutofBoundsException

此外lArray包含自然数<=x,但仅排除 一个 数字1,其值应为x-1而非x-2

答案 1 :(得分:5)

改为将数组长度更改为(x - 1),然后使用<条件,您已经找到了这个条件,以避免越界异常。

你需要一个比你当前使用的元素大1个元素的数组的原因是因为有(n - 1)个候选者必须考虑在2和n之间,而不是(n - 2)

例如,有两个候选人小于或等于三个(2和3),其中两个恰好都恰好是素数。

答案 2 :(得分:3)

for (int i = 0; i <= newArray.length; i++) //should be <, not <=
for (int i = 0; i < newArray.length; i++)

答案 3 :(得分:1)

您需要使用:

int lArray = x - 1;

并更改条件以使用<代替<=

在Java和C / C ++中,数组是基于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 )。