【问题标题】:Getting ArrayIndexOutOfBoundsException after a Certain INPUT value在某个 INPUT 值之后获取 ArrayIndexOutOfBoundsException
【发布时间】:2012-06-26 07:07:03
【问题描述】:

对于在 int 输入值 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 arrays exception


    【解决方案1】:

    您遇到了算术溢出。

    在 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 &lt; 46340 的输入值的范围,或者如果它确实需要使用n = 46349 输入,请切换到long 数据类型,这将适用于n = 3037000499

    【讨论】:

      【解决方案2】:

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

      它通过了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 2018-08-12
        相关资源
        最近更新 更多