在某个INPUT值之后获取ArrayIndexOutOfBoundsException

时间:2012-06-26 07:07:03

标签: java arrays exception

对于在输入值为46348之后的给定下面的代码,我得到ArrayIndexOutOfBoundsException。我在 for 循环中给出了条件,以保持数组限制。但不知怎的,我得到了这个例外,我无法弄明白。我的要求是找到给定数字以下的所有主数字。

 Scanner sc = new Scanner(System.in);
    int n= sc.nextInt();
    int[] arr= new int[n+1];
            for(int i=2;i<=n;i++)
            {
                if(arr[i]==0)
                {
                    for(j=i;j*i<=n;j++)
                        arr[j*i]=1; // Here i am getting Exception
                }
            }

输入:

46349

输出:

java.lang.ArrayIndexOutOfBoundsException:-2146737495

502802

感谢。,

2 个答案:

答案 0 :(得分:3)

您遇到了算术溢出。

在Java中,int数据类型是32位有符号整数,这意味着它的值可以在-2147483648和2147483647之间。

在这一行:

for(j=i;j*i<=n;j++)

如果i为46349,则j也会变为46349。如果将46349乘以46349,则得到2148229801,大于2147483647,因此整数溢出并变为-2146737495。当然,它小于46349,因此for - 循环中的检查通过。但是你不能用Java中的负值索引数组,这就是你获得ArrayIndexOutOfBoundsException的原因。

范围检查n < 46340的输入值,或者如果确实需要使用n = 46349输入,请切换到long数据类型,这将最多n = 3037000499

答案 1 :(得分:0)

46349 * 46349太大,无法用作Java Array的索引。索引只是一个32位有符号整数,因此最大值为2,147,483,648。

它通过&lt; n检查因为它溢出并返回负数,所以它实际上小于n,但负数不是合法的数组索引。