2010-10-16 126 views
7
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,但我确定如果我在另一种语言中编码类似,我将面临同样的问题。这是一个应用程序的摘录,其中列出了所有素数直到用户输入。Java:数组索引超出范围

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

我注意到,对于线

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

如果我改变i <= newArray到,代码工作没有错误。但是,如果x是素数,那么用户的输入x将被忽略,这是一个问题。

回答

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

5

改为将数组长度更改为(x - 1),并使用<条件,您已经发现该条件是避免出界异常的必要条件。

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

例如,有两个候选小于或等于三(2和3),这两个巧合地恰好是质数。

+0

+1考虑到两个问题 – 2010-10-16 23:35:38

1

您需要使用:

int lArray = x - 1; 

,改变你的条件使用<而不是<=

在Java中和C/C++一样,数组是基于零的。因此,您的N值将从索引到N-1

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

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

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

因此,阵列lenght必须(N-1)。

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