2016-08-14 15 views
-1

コードでは、バイトバッファを使用して2つの整数からバイト配列を生成します。配列を出力ストリームに書き込もうとすると、ArrayIndexOutOfBounds例外が発生します。 OutputSteamのwrite(array、offset、length)メソッドの長さパラメータは、配列自体からプロパティを渡しても配列が配列の長さよりも小さくなると考えています。ダミーデータを書き込むだけでファイルが十分に大きいことを確認しましたが、同じ例外が発生します。バイト配列の長さが正しくない

OutputStream out = new FileOutputStream("File"); 
ByteBuffer buff = ByteBuffer.alocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 

out.write(array, 0, array.length); // Heres where the problem comes in 
+0

オフセットは何ですか? –

+3

そのコードは有効なJavaではありません。助けが必要な場合は、失敗した_actual_ Javaコードを投稿する必要があります。また、スタックトレースをポストし、 'offset'のような変数の値を示します。 –

+0

いいえ、問題はコメントの行よりも早くなります。今のところ、コンパイルさえしないコードを投稿しているという事実です。 – GhostCat

答えて

1

まあ、arrrayは、N個のオブジェクトを持っており、それが0 Array.lengthとから始まるので、最後のオブジェクトは、N-1でインデックスされるがNである、あなたはN-1が欲しいです。

+0

'write'コールは完全に有効です:'要素b [off]は最初に書き込まれたバイトであり、b [off + len-1]はこの操作によって書き込まれた最後のバイトです ' –

+0

私はそれを試しました。半分以上を差し引いた後 – Honin

+0

その場合、私は分かりません。私はそれが 'out'それ自体に問題であると思う。私の経験上、問題を解決する最善の方法は、エラーを聞いたり、オンラインで詳細を投稿することです。 – Darkrifts

0

array.lengthにはバイト数が指定されているため、バッファに割り当てるときにInteger.SIZE(整数あたりのビット数)ではないInteger.BYTES(整数あたりのバイト数)を使用します。

ByteBuffer buff = ByteBuffer.allocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 
+0

これにより、出力ストリームへの書き込み時にIndexOutOfBounds例外が発生します – Honin

関連する問題