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值数组将从索引0N-1

以你为例: {2, 3, 4, 5... x}

您将需要N-1值来存储所有正数,但是1个整数数组中。 所以,如果N等于4 ,你的数组将是:

 newArray[0] = 2; newArray[1] = 3; newArray[2] = 4; 

因此,数组长度必须是3N-1 )。