java - 我试图通过迭代用整数填充数组,但出现 ArrayIndexOutOfBoundsException

标签 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();

我得到了这个:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2147479015 at javaapplication6.JavaApplication6.main(JavaApplication6.java:26) C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 1 second)

但我不明白为什么会发生这种情况。据我所知,当您尝试访问不存在的索引时,会发生此类异常。我已经检查了很多次我的代码,但一直无法找到问题所在。

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

Exception in thread "main" 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();

我想首先了解为什么会发生该异常,以及为什么通过添加代码的其他部分来“解决”它,其次,为什么我的代码似乎陷入了第一个 for 循环。

如果您能帮助我理解这些事情,我将不胜感激。

提前致谢。

最佳答案

在您的代码中,您有

int mult = current*m;

其中currentmsteps数组的大小

所以 1000001 * 1000001 将超过数组的大小,也超过最大 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);
     }
}

关于java - 我试图通过迭代用整数填充数组,但出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724238/

相关文章:

java - 斜体的变量类型

Netbeans 常用的代码片段

java - Apache Flink连接elasticsearch的问题

java - 为什么java正则表达式失败

java - Android 默认按钮颜色

java - 以 quoteMode NON_NUMERIC 编写 CSV 文件,只包含字符串和非数字单元格,并用引号括起来

javascript - 使用 array.filter 向下多个级别

php - 根据两列值和每组中一列的总和对多维数组数据进行分组

iOS:如何分隔数组中的特定字符串元素?

java - 如何使表格单元格使用TableLayout中的所有屏幕高度?