2011-10-15 123 views
1

我想创建一个144 FloatBuffers的数组,所以我可以轻松访问每个使用整数来挑选哪一个。不,我的意思不是FloatBuffer长。我正在研究使用一个类来包含所有的FloatBuffers,但这需要一些时间。有什么想法吗?异常实例化FloatBuffer []

我得到

java.lang.ArrayIndexOutOfBoundsException: 0 

在这一行,不管我用什么方法来尝试实例化新FloatBuffer到数组:

for(int i=0; i<144;i++){ 
    vbuffers[i] = BufferUtils.createFloatBuffer(buffervolume*7); 
    } 

我也尝试这样做,得到了同样的错误:

 vbuffers[i]=FloatBuffer.allocate(buffervolume*7); 

以下是完整的相关代码:

public class myclass { 

public FloatBuffer[] vbuffers; 

public myclass(){ 
    vbuffers=new FloatBuffer[chunklimit*chunklimit*4]; 
    for(int i=0; i<144;i++){ 
    vbuffers[i] = BufferUtils.createFloatBuffer(chunkvolume*7); 
    } 
} 
} 

我想补充一点,我结束了使用一个大的FloatBuffer和glbuffersubdata来管理我的数据,并得到了非常好的结果。

+0

什么是'chunklimit'? –

+0

我的猜测是vbuffers [i]。检查你的数学,确保chunklimit * chunklimit * 4足够大。使用调试器来查看它抱怨的是什么值。 – VoidStar

+0

我会检查你的FloatBuffers使用本地字节顺序的直接内存。在big endian中使用堆或直接内存可能会慢很多。 (除非你需要在big-endian中使用它们) –

回答

2

该异常强烈暗示vbuffers是一个零长度数组。检查chunklimit是否非零。

在一般情况下,当你有这样的代码:

vbuffers = new FloatBuffer[chunklimit*chunklimit*4]; 
for(int i = 0; i < 144; i++) { 
    vbuffers[i] = ... 

有一个风险,即chunklimit*chunklimit*4不会是一样144,因而产生误差。

它通常是一个更好的主意使用数组的大小在for循环:

vbuffers = new FloatBuffer[chunklimit*chunklimit*4]; 
for(int i = 0; i < vbuffers.length; i++) { 
    vbuffers[i] = ... 
+0

这有助于数组的运行,但不幸的是,最终结果并不适用于我的程序(从144缓冲区中抽取效率非常低),并且不想正确读取数据。我不太清楚为什么144不起作用,因为那正是长度。但是这是对的,谢谢。 – Sean