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,这是一个问题。
答案 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 )。