在某个INPUT值之后获取ArrayIndexOutOfBoundsException

对于在输入值为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

谢谢。,

您遇到了算术溢出。

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

在这一行:

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

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

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

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

它通过