2011-10-15 97 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