我试图通过迭代来填充整数数组,但是我得到了一个ArrayIndexOutOfBoundsException

时间:2018-04-09 00:51:50

标签: java arrays netbeans indexoutofboundsexception

我尝试使用此代码填充整数数组:

    int[] steps = new int[1000001];
    steps[0] = 0;
    steps[1] = 1;
    steps[2] = 2;

    for(int i = 1001; i < steps.length; i++){
        if(steps[i]==0){
             steps[i] = steps[i-1]+1;
        }
        int current = i;

        for(int m = current; m > 1; m--){
            int mult = current*m;
            if(mult<steps.length){
                int suma = steps[current]+1;
                if(steps[mult]==0){
                    steps[mult] = suma;
                }
                if(suma<steps[mult]){
                    steps[mult] = suma;
                } 
            }                      
        }
    }

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();

    for(int k = 0; k < n; k++){

        int q = scan.nextInt();
        System.out.println(steps[q]);

    }

    scan.close();

我得到了这个:

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:-2147479015       在javaapplication6.JavaApplication6.main(JavaApplication6.java:26)   C:\ Users \ User \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml:53:Java返回:1   建筑失败(总时间:1秒)

但我不明白为什么会这样。我知道当您尝试访问不存在的索引时会发生此类异常。我已经多次检查了我的代码,但我还没有找到问题。

你知道这个数字是什么意思吗?因为这让我感到困惑:

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException: -2147479015

NetBeans表示问题出在:

  

javaapplication6.JavaApplication6.main(JavaApplication6.java:的 26

第26行就是这个:

if(steps[mult]==0)

我认为这就是说,在某些时候,程序正在尝试访问数组中不存在的索引。问题是,我不明白这可能会发生在那里。

我之前提到这一行是为了避免这种情况,但似乎无法发挥作用:

if(mult<steps.length)

然后我通过将其更改为此行来修改该行,它似乎工作。它不再显示例外:

if(mult<steps.length && mult >=0)

现在的问题是,显然,它没有进入代码的这一部分:

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    for(int k = 0; k < n; k++){
        int q = scan.nextInt();
        System.out.println(steps[q]);
    }

    scan.close();

我想先了解一下,为什么会出现这种异常以及为什么会出现这样的问题?#34;通过添加代码的其他部分,第二,为什么我的代码似乎陷入我的第一个for循环。

如果你能帮我理解那些事情,我真的很感激。

提前致谢。

1 个答案:

答案 0 :(得分:2)

在您的代码中

int mult = current*m;

其中currentmsteps数组的大小

所以1000001 * 1000001将超出数组的大小并且还超过max int值

我不确定你想做什么逻辑

if(steps[mult]==0){

您可以使用此代码显示问题

int val = 1000000;

for (int i = 0; i < 100; i++) {
     val = val * val;
     if (val < 0) {
         System.out.println(val);
     }
}