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 )。