2015-06-12 30 views
1

我有一个长度为97536的索引数组,当它到达16,129时,它给了我一个空指针异常。 Index[] indices = new Index[6 * (VERTEX_COUNT - 1) * (VERTEX_COUNT * 1)];。然后我有一个double for循环和一个指针来循环数组中的所有对象并初始化它们。为什么我的0-16129的索引数组不是null,其余的都是?

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[] indices时,没有出现此错误。我很困惑,想知道为什么在16129发生空指针异常。第一个想法是,for循环从来没有达到正确的数字,如果是的话,我将如何计算? - 提前致谢

+0

你是如何实例数组? –

+4

您似乎也在覆盖阵列中相同的位置6次 - 您可能想重新考虑阵列的工作方式。 –

+0

为什么你不断更换你正在实例化的所有对象?这只会让他们因为超出范围而被GC'd。并且由于您正在运行嵌套循环,因此您将以'pointer = VERTEX_COUNT * VERTEX_COUNT'个迭代结束...... –

回答

0

你说你的数组是97536项。所以我推断VERTEX_COUNT=128。我注意到6*127*128 = 97536

您正在通过嵌套for循环,其中每个循环运行从0到VERTEX_COUNT-1运行时,或从0到127 127*127=16129,并且如上面所指出的,你覆写阵列在相同的位置在6次评议每个内部循环,所以你只是实例化从0到16128.因此,当你尝试访问位置16129(及以上)时,你将检索null,这会自动抛出你的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 ...

+0

我想出了问题,但感谢您的好建议! – danyguag

+0

我得到了所有的值来初始化,但它给了我同样的错误 – danyguag

+0

从定义上来说,如果你得到一个'NullPointerException',你没有得到所有的值初始化。但是让我们保留注释的细节 - 您可以根据需要更新此问题,或者提出新问题。 – dcsohl

相关问题