Java 为什么0-16129的索引数组不是空的,而其余的都是空的?

Java 为什么0-16129的索引数组不是空的,而其余的都是空的?,java,game-engine,Java,Game Engine,我有一个长度为97536的索引数组,当它达到16129时,它会给我一个空指针异常索引[]索引=新索引[6*(顶点计数-1)*(顶点计数*1)]。然后我有一个double for循环和一个指针来循环数组中的所有对象并初始化它们 int pointer = 0; for(int gz = 0; gz < VERTEX_COUNT - 1; gz++) { for(int gx = 0; gx < VERTEX_COUNT - 1; gx++)

我有一个长度为97536的索引数组,当它达到16129时,它会给我一个空指针异常<代码>索引[]索引=新索引[6*(顶点计数-1)*(顶点计数*1)]。然后我有一个double for循环和一个指针来循环数组中的所有对象并初始化它们

int pointer = 0;

    for(int gz = 0; gz < VERTEX_COUNT - 1; gz++)
    {
        for(int gx = 0; gx < VERTEX_COUNT - 1; gx++)
        {
            indices[pointer] = new Index((gz * VERTEX_COUNT) + gx);
            indices[pointer] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
            indices[pointer] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
            indices[pointer] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
            indices[pointer] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
            indices[pointer] = new Index((((gz + 1) * VERTEX_COUNT) + gx) + 1);
            pointer++;
        }
    }
int指针=0;
for(intgz=0;gz
当数组是
int[]索引时,没有出现此错误。我很困惑,想知道为什么空指针异常发生在16129。第一个想法是for循环永远不会达到正确的数字,如果是,我该如何计算?

-提前感谢

您说您的阵列是97536项。所以我推断出顶点计数=128。我是通过注意到
6*127*128=97536
得出这个结论的

您正在运行一个嵌套的
for
循环,其中每个循环从0运行到顶点计数-1,或从0运行到127
127*127=16129
,正如上面的一位评论员所指出的,在每个内部循环中,您会覆盖数组中的同一位置6次,因此您只能从0到16128进行实例化。因此,当您尝试访问位置16129(及以上)时,您将检索
null
,如果您未经检查就取消引用NPE,它自然会抛出NPE

我假设你不想对同一个索引写六次,而是连续写六次,所以我的建议是

    { // inner loop body
        indices[pointer++] = new Index((gz * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
        indices[pointer++] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
        indices[pointer++] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index((((gz + 1) * VERTEX_COUNT) + gx) + 1);
        // DO NOT DO pointer++ HERE
    }

我打赌当它是一个
int[]
时你也有同样的问题,但你以前从未注意到,因为
int[]
中每个项目的默认值是0(不是
null
),这不会给你NPE…

你说你的数组是97536个项目。所以我推断出顶点计数=128。我是通过注意到
6*127*128=97536
得出这个结论的

您正在运行一个嵌套的
for
循环,其中每个循环从0运行到顶点计数-1,或从0运行到127
127*127=16129
,正如上面的一位评论员所指出的,在每个内部循环中,您会覆盖数组中的同一位置6次,因此您只能从0到16128进行实例化。因此,当您尝试访问位置16129(及以上)时,您将检索
null
,如果您未经检查就取消引用NPE,它自然会抛出NPE

我假设你不想对同一个索引写六次,而是连续写六次,所以我的建议是

    { // inner loop body
        indices[pointer++] = new Index((gz * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
        indices[pointer++] = new Index(((gz * VERTEX_COUNT) + gx) + 1);
        indices[pointer++] = new Index(((gz + 1) * VERTEX_COUNT) + gx);
        indices[pointer++] = new Index((((gz + 1) * VERTEX_COUNT) + gx) + 1);
        // DO NOT DO pointer++ HERE
    }


我敢打赌,当它是
int[]
时,您也有同样的问题,但您以前从未注意到,因为
int[]
中每个项目的默认值都是0(而不是
null
)这不会给你带来NPE…

你是如何实例化数组的?你似乎也在6次覆盖数组中的同一位置-你可能想重新了解数组的工作方式。你为什么一直替换所有正在实例化的对象?这只会导致他们得到GC'd,因为他们已经超出了范围。由于您正在运行嵌套循环,您将以
pointer=VERTEX\u COUNT*VERTEX\u COUNT
迭代结束…VERTEX\u COUNT的值是多少?我解决了这个问题,但感谢您的建议!您是如何实例化数组的?您似乎还覆盖了数组中的同一位置6次-您可能想重新了解数组的工作方式。为什么要不断替换所有正在实例化的对象?这只会导致他们得到GC'd,因为他们已经超出了范围。由于您正在运行嵌套循环,您将以
pointer=VERTEX\u COUNT*VERTEX\u COUNT
迭代结束…VERTEX\u COUNT的值是多少?我解决了这个问题,但感谢您的建议!您是如何实例化数组的?您似乎还覆盖了数组中的同一位置6次-您可能想重新了解数组的工作方式。为什么要不断替换所有正在实例化的对象?这只会导致他们得到GC'd,因为他们已经超出了范围。由于您正在运行嵌套循环,您将以
pointer=VERTEX\u COUNT*VERTEX\u COUNT
迭代结束…VERTEX\u COUNT的值是多少?我解决了这个问题,但感谢您的建议!我得到了所有要初始化的值,但根据定义,它给了我相同的错误。如果你得到的是
NullPointerException
,你没有得到所有要初始化的值。但是让我们不要评论细节——你可以根据需要用更多细节更新这个问题,或者问一个新问题。我得到了所有要初始化的值,但它给了我相同的错误。根据定义,如果你得到一个
NullPointerException
,你没有得到所有要初始化的值。但是让我们不要评论细节——你可以根据需要用更多细节更新这个问题,或者问一个新问题。我得到了所有要初始化的值,但它给了我相同的错误。根据定义,如果你得到一个
NullPointerException
,你没有得到所有要初始化的值。但是让我们不要评论细节——你可以根据需要用更多细节更新这个问题,或者问一个新问题。